【发布时间】:2018-08-23 02:24:37
【问题描述】:
我有一个大约 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定义不是更升级到服务器端分页,我会加上“bProcessing”:true和“serverSide”:true。
非常感谢您,
问候。
【问题讨论】:
-
这里有什么问题?
-
对不起,描述的情况我没有把问题说清楚。
-
我想知道如何将您需要的参数传递给 DataTables 以进行服务器端分页。从查询中,查询需要一些其他参数,但我不知道如何查看并传递给 ajax 调用。
标签: php jquery sql-server datatables