我使用jquery数据表来显示一个网格,该网格使用webapi来检索它的数据。 webapi使用linq查询mssql数据库,它巧妙地使用过滤,排序和skip / take在包含大约一百万条记录(并且正在增长)的索引良好的表上组装它的查询。常见的情况。
它表现得非常好。浏览器必须等待大约50毫秒的响应(例如,分页)才能返回。
然而,在我看了一个分析工具后,我注意到只用了25毫秒就可以选择表的总行数。我想知道的是因为我希望数据表显示如下内容:"显示从1.000.000"过滤的45.000的第1行到第10行需要总数。
我实际上并不需要知道从服务器每次旅行的精确总数(它只是提供信息)所以我可能会保留值服务器端并在不同的任务中每秒刷新它它干扰了数据表的数据检索。我会尽快退回'足够接近'总行数的值。
是否有可靠的机制?我尝试将总行数放在多个用户在多次回调期间使用的静态中,并且每次请求时都会触发异步任务以刷新它。
然而,感觉很icky,分享静态并且有不同的线程更新,它并没有让我觉得那些稳定。每次从我的数据更改为我的域模型时,我都会查看SqlDependency来推送记录计数,但这似乎并不支持SELECT COUNT(Id)FROM TABLE场景。
有什么想法吗?
答案 0 :(得分:1)
如果可能,您可以使用其中一个系统表。您可以每分钟ping一次并将其粘贴在缓存中。这个article有两个,它声称是足够的选择:
--The way the SQL management studio counts rows (look at table properties, storage
--, row count). Very fast, but still an approximate number of rows.
SELECT CAST(p.rows AS float)
FROM sys.tables AS tbl
INNER JOIN sys.indexes AS idx ON idx.object_id = tbl.object_id and idx.index_id < 2
INNER JOIN sys.partitions AS p ON p.object_id=CAST(tbl.object_id AS int)
AND p.index_id=idx.index_id
WHERE ((tbl.name=N'Transactions'
AND SCHEMA_NAME(tbl.schema_id)='dbo'))
或
--Quick (although not as fast as method 2) operation and equally important, reliable.
SELECT SUM (row_count)
FROM sys.dm_db_partition_stats
WHERE object_id=OBJECT_ID('Transactions')
AND (index_id=0 or index_id=1);
答案 1 :(得分:1)
您是否考虑过执行查询时计算,然后通过SignalR将值反映给客户?
基本上,当LINQ调用返回时,获取.Count()并将值移交给后台线程,让SignalR通知客户端更新,同时将数据返回给请求客户端。
SignalR将激活所有客户端页面中的javascript函数,然后您可以获取传入的值并将其显示在页面的某个位置。