由于我们的数据库(当我们处理50M记录时)的计数(*)表现不佳,我们不想返回到我们检索的每个记录片段中的记录总数。相反,我们希望没有它。我可以在jsonReader:{records:MAX_INT}中将记录总数设置为MAX_INT,但我想让它更好。
我想要做的是在网格加载时设置MAX_INT的记录(这部分我知道如何),但是并行地在后台启动一个count(*)调用,最终当真正的计数器将是检索,我想用真实计数器覆盖MAX_INT,这是真实的记录数。
如何覆盖记录计数器数量?
谢谢,
答案 0 :(得分:1)
首先,它是COUNT(*)
的众所周知的问题。如果需要只获得数据库某些特定表的行数,那么可以非常轻松快速地获取信息
SELECT rows
FROM sys.partitions
WHERE index_id IN (0, 1)
AND object_id = OBJECT_ID('dbo.Tablename')
在更常见的情况下(如果数据不仅在一个分区中),则应使用SUM(rows)
而不是rows
。见
我认为可以以同样的方式使用sys.dm_db_partition_stats
SELECT row_count
FROM sys.dm_db_partition_stats
WHERE index_id IN (0, 1) AND object_id = OBJECT_ID('dbo.Tablename')
您可以检查数据库并测试COUNT(*)
是否返回与上述SQL语句或其他一些近似变体相同的值。
独立于COUNT(*)
的问题,您可以使用records
或total
定义为函数,并且不会从服务器返回任何records
或total
。 records
在大多数情况下并不重要。如果使用viewrecords: true
选项,它将显示在寻呼机上。您可以使用默认viewrecords: false
,并且在服务器响应中设置records
字段时没有问题。
服务器响应的total
属性将在另一侧用于设置jqGrid的lastpage
参数,该参数将用于验证“下一页”和“最后一页”按钮是否为寻呼机将被启用或不启用。你能做的是
jsonReader: {
total: function (response) {
return parseInt(response.page) + 1;
}
}
或者您可以返回任何其他值,例如Number.MAX_VALUE
或最大整数9007199254740992
(2 53 ,请参阅the answer)。