У меня есть большая база данных из ~ 120 тыс. Записей, и я написал приложение для взаимодействия с его данными, с частью для их редактирования, которую я должен улучшить, потому что я получаю данные из диалогов, и должно быть лучше, если я буду использовать встроенные. Это приложение создано с помощью jQuery - jQueryUI - Datatables.
В качестве обходного пути, чтобы избежать больших запросов в основном выборе, я уменьшил вероятность предоставления большого количества данных. Сервер представляет собой Windows 2008 R2, на котором работает экземпляр IIS с модулем PHP, этот модуль в начале был настроен для работы с 256 МБ памяти, я переключился на 512 МБ из-за узкого места в памяти, но у меня все еще было узкое место на объем памяти. Измеряя его, я заметил, что в некоторых запросах ему требуется больше памяти, около ~ 600 МБ, по этой причине я оставил memory_limit -1, поэтому без ограничений.
На самом деле промежуточное ПО PHP возвращает набор результатов как json, он выполняет преобразование, для которого требуется двойной объем памяти.
Прошу прощения, если я останусь в объяснениях по этому поводу, я просто хочу понять суть моей работы.
Кстати, когда я писал приложение, у меня не было времени изучить решение, но теперь у меня есть
.
Теперь пришло время, когда sql server 2008 R2 не реализует ограничения при выборе запроса.
Прежде всего я сделал запрос с ограничениями на сервере sql:
https://pastebin.com/8JZTAerE
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 1
SELECT *
FROM
(SELECT
myview.*,
ROW_NUMBER() OVER (ORDER BY foo) AS RowNum
FROM myview WHERE 1=1
-- AND foo AND bar AND baz
) AS BDT
WHERE
BDT.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1
AND @RowsPerPage*(@PageNumber)
Чтобы этот запрос работал, мне или DataTables необходимо передать еще несколько параметров, например RowsPerPage, PageNumber, критерии сортировки и строку фильтрации, которые позволяют выполнить второй просмотр возвращаемого набора результатов. Это похоже на секунду, потому что вы можете указать через секунду после того, как вы сделали основной запрос. Также следует изучить это, потому что в некоторых примерах эта фильтрация выполняется для каждого поля таблицы, но, конечно, в DataTable есть два типа фильтрации для набора результатов: глобальная, которая работает с каждым полем, и локальная, которая работает с одним полем, поэтому запрос должен быть более сложным и включать два раздела фильтрации. Но это в чистой проблеме sql, PHP и DataTable не должны заботиться. Как это сделать? В каждом найденном мной примере никто не указывает данные в вызове ajax. Я думал, что DataTables передаст это в массив сообщений, но мне нужно указать, потому что я должен передать свои параметры. Это мой вызов ajax:
function ajax_search() {
return $.ajax({
beforeSend: function(event, ui) {
$('#contents').html('<h2>' + title + ' <img src = "imgs/loader.gif" alt = "Loading..."></h2>');
},
type: 'POST',
url: 'json/ricerca_bdt_ssp.php',
dataType: 'json',
data: {
'user': account,
'pass': password,
'user_ad': account_ad,
'pass_ad': password_ad,
'device': deviceid,
'host': dbhost,
'port': dbport,
'db': dbname,
'foo': field_foo,
'bar': field_bar,
'baz': field_baz,
...
'other_field': bdt_other_fields,
'other_pattern': bdt_other_pattern
}
});
};
Определение My DataTables (плюс некоторая другая конфигурация для сортировки всплывающих подсказок и флажков):
table = $("#mytable").DataTable({
buttons: [ one,two,three ],
aoColumnDefs: [
{ 'sWidth': '150px', 'aTargets': [1,2,7,8,12,13,15,16,18,19,20,21,22,23,24] },
....
],
select: { style: 'multi', selector: 'td:first-child' },
'autoWidth': false,
iDisplayLength: 100,
'scrollY': '50vh',
'scrollX': 'true',
'scrollCollapse': 'true'
});
Мое определение DataTables больше не подлежит обновлению до разбивки на страницы на стороне сервера, я добавлю «bProcessing»: true и «serverSide»: true.
Заранее большое спасибо,
С уважением.
Простите, чтобы описать ситуацию, я не уточнил вопрос.
Мне было интересно, как передать необходимые параметры в DataTables для разбивки на страницы на стороне сервера. В запросе есть другие параметры, которые необходимы для запроса, но я не знаю, как просмотреть и передать вызов ajax.






если вы хотите использовать серверную часть, сделайте следующее:
//...
serverSide: true,
ajax: {
url: "json/ricerca_bdt_ssp.php",
method: "POST",
data: function (d) {
d.user = account;
d.pass = password;
//...
d.other_field = bdt_other_fields;
d.other_pattern = bdt_other_pattern;
}
//...
d - это объект, содержащий все необходимые параметры для пейджинга, в частности start и length. Вы можете развернуть d, как показано.
то вам нужно отформатировать возвращенный json, как указано в ссылке.
Спасибо, мужик, это работает, и это было то, что мне нужно. Теперь мне просто нужно закончить ресурс промежуточного программного обеспечения.
В чем тут вопрос?