我有一个大约120k记录的大型数据库,我编写了一个与其数据交互的应用程序,还有一部分用于编辑它们,我必须改进它们,因为我从对话框中获取数据并且它应该更好如果我做内联。这个应用程序是用jQuery - jQueryUI - Datatables制作的。
作为避免主要选择中的大问题的解决方法,我减少了提供大量数据的机会。服务器是一个Windows 2008 R2,在其上运行带有模块PHP的IIS实例,这个模块在开始时被配置为运行256MB内存,由于内存瓶颈,我已经切换到512MB,但我仍然遇到了瓶颈问题。记忆。测量它我在一些查询中注意到它需要更多的内存,大约600MB左右,因此我离开了memory_limit -1,因此无限。
实际上PHP中间件将结果集作为json返回,他进行转换需要双倍的内存
如果我在关于这个问题的解释中,我道歉,我只是为了表达我的工作
顺便说一句,当我编写应用程序时,我没有时间研究解决方案,但现在我已经有了
现在来了,sql server 2008 R2没有实现查询选择的限制
首先,我在sql server中进行了限制查询:
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将它赋予post数组,但我需要指定,因为我必须传递我的参数 这是我的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
}
});
};
我的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定义不再升级到服务器端分页,我将添加&#34; bProcessing&#34;:true和&#34; serverSide&#34;:true。
非常感谢您提前,
问候。
答案 0 :(得分:0)
如果您想使用服务器端,则应执行以下操作:
//...
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
是一个对象,其中包含分页所需的所有parameters,特别是start
和length
。您可以展开d
,如图所示。
然后你必须格式化链接中指定的返回的json。