C# 连续异步获取SELECT计数

C# 连续异步获取SELECT计数,c#,asp.net-web-api,datatables,C#,Asp.net Web Api,Datatables,我使用jquerydatatables来显示一个网格,该网格使用webapi来检索它的数据。webapi使用linq查询mssql数据库,它巧妙地使用过滤、排序和skip/take将其查询组装到一个索引良好的表上,该表包含大约一百万条记录(并且不断增长)。一个常见的场景 它的表现真的很好。浏览器必须等待大约50毫秒才能返回响应(例如分页时) 然而,在我使用分析工具查看之后,我注意到仅选择表的总行数就需要使用大约25毫秒。我想知道这一点,因为我想让datatable显示这样的内容:“显示从1.00

我使用jquerydatatables来显示一个网格,该网格使用webapi来检索它的数据。webapi使用linq查询mssql数据库,它巧妙地使用过滤、排序和skip/take将其查询组装到一个索引良好的表上,该表包含大约一百万条记录(并且不断增长)。一个常见的场景

它的表现真的很好。浏览器必须等待大约50毫秒才能返回响应(例如分页时)

然而,在我使用分析工具查看之后,我注意到仅选择表的总行数就需要使用大约25毫秒。我想知道这一点,因为我想让datatable显示这样的内容:“显示从1.000.000中筛选出的45.000中的第1到第10行”,需要总计数

实际上,我不需要知道每次从服务器访问的精确总计数(只是提供信息),因此我可能可以保留值服务器端,并在不同的任务中每秒刷新它,而不会干扰数据表的数据检索。我只返回总行数的“足够接近”值

有一个可靠的机制吗?我尝试将总行数放在多个用户在多次回调期间使用的静态中,每次请求时都会触发一个异步任务来刷新它

这感觉很恶心,但是,共享静态和有一个不同的线程更新,它不觉得所有的稳定对我来说。我已经研究过SqlDependency,每当recordcount从我的数据更改到我的域模型时,它都会推送recordcount,但这似乎不支持从表场景中选择计数(Id)


有什么想法吗?

如果可能,您可以使用其中一个系统表。您可以每分钟ping一次,然后将其粘贴到缓存中。它声称有两种选择是足够的:

--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'))

您是否考虑过在执行查询时进行计数,然后通过SignalR将值回传给您的客户

基本上,当LINQ调用返回get a.Count()并将该值传递给后台线程以让Signal通知客户端更新时,同时将数据返回给请求的客户端

signer将在所有客户端页面中激活一个javascript函数,然后您可以获取传入的值并将其显示在页面的某个位置


使用绝对过期的条目怎么样?当然,在web场景中比静态的要好。我同意,但如何以稳定的方式更新它。你说的“稳定”是什么意思?更新的一个选项是添加一个
CacheItemPolicy
,其中包括一个
RemovedCallback
,该调用将再次获取计数。将绝对过期时间设置为大约1秒是否有效?我需要最新的值始终可用,即使它正在刷新它。当我对removecallback采取行动时,我会说值已经消失了。这是对的吗?是的,这只是我脑海中浮现的第一件事,也许不适用于你的具体情况。这是一篇非常有趣的文章。我一定会试试的。然而,缺点似乎是,我需要从我相对干净和简单的代码优先模型到将查询合并到系统表中,有一个很大的偏差。尽管如此,我还是要考虑一下。谢谢。实际上我还没有考虑过。这是一个有趣的尝试,它可以工作,因为web应用程序的所有用户都在使用相同的总记录数查看同一个表。我可以把它和页面加载的第一个值结合起来,把它放在我的剃须刀里。之后,我使用信号器更新它。有趣。谢谢。如果我尝试一下,我会让你知道的。我现在使用这种技术在一些场景中为我的用户实际填充表数据。当数据更新时,我对其进行一次查询,然后将整个结果通知客户机。1点击数据库,每个人都会得到更新。听起来不错,但我只能用它来计算总数。用户在浏览器中有复杂的客户端过滤器。虽然他们看的是同一张表,但他们肯定看的不是同一个结果集。然而,我并没有对信号器做任何有用的事情,所以这可能是一件有趣的事情。我仍然需要某种服务器端计时器来获取最新的totalcount。在MVC中使用线程循环看起来很难看。
--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);