繁体   English   中英

使用dm_db_partition_stats获取过滤的行数

[英]Get filtered row count using dm_db_partition_stats

我在我的应用程序中使用分页,但是我注意到分页进行得非常慢,以下是罪魁祸首:

SELECT COUNT (*) FROM MyTable

在我的只有900万行的表上,需要43秒才能返回行数。 我读过另一篇文章,该文章指出要返回14亿行的行数,需要5分钟以上的时间。 这显然不能与分页一起使用,因为它太慢了,我需要行数的唯一原因是计算可用页面的数量。

经过一番研究,我发现使用以下命令可以立即(准确地)获得行数:

SELECT SUM (row_count)
FROM sys.dm_db_partition_stats
WHERE object_id=OBJECT_ID('MyTable')
AND (index_id=0 or index_id=1)

但是上面的方法返回了整个表的计数,如果没有应用过滤器,这很好,但是如果我需要应用过滤器(例如日期范围和/或状态),该如何处理呢?

例如,当DateTime字段介于2013-04-05和2013-04-06之间且status ='warning'时,MyTable的行计数是多少?

谢谢。

UPDATE-1

如果不清楚,我需要可用的总行数,以便可以确定使用“分页”功能时与查询匹配的所需页数。 例如,如果一个页面返回20条记录,而与查询匹配的记录总数为235,我知道我需要在网格下方显示12个按钮。

01-(第1至20行)-20行显示在网格中。 02-(第21至40行)-20行显示在网格中。 ... 11-(第200至220行)-网格中显示20行。 12-(第221至235行)-在网格中显示15行。

将添加其他逻辑来处理大量页面,但这是一个UI问题,因此不在本主题范围内。

使用“从MyTable中选择count(*)”的问题是,它对900万条记录花费了40秒钟以上的时间(认为现在已经不复存在了,我需要找出原因!),但是使用这种方法,我可以添加与我的查询相同的过滤器来确定查询。 例如,

SELECT COUNT(*) FROM [MyTable]
WHERE [DateTime] BETWEEN '2018-04-05' AND '2018-04-06' AND
      [Status] = 'Warning'

确定页数后,我将运行相同的查询,但要包括字段而不是count(*),CurrentPageNo和PageSize,以便使用行ID按页码过滤结果,并在需要时导航到特定页面。

SELECT RowId, DateTime, Status, Message FROM [MyTable]
WHERE [DateTime] BETWEEN '2018-04-05' AND '2018-04-06' AND
      [Status] = 'Warning' AND
      RowId BETWEEN (CurrentPageNo * PageSize) AND ((CurrentPageNo + 1) * PageSize)

现在,如果我使用其他提到的方法来获取行数,即

SELECT SUM (row_count)
FROM sys.dm_db_partition_stats
WHERE object_id=OBJECT_ID('MyTable')
AND (index_id=0 or index_id=1)

它会立即返回计数,但是我该如何过滤它,以便可以像使用SELECT COUNT(*)方法一样包含相同的过滤器,因此最终会得到类似以下内容:

SELECT SUM (row_count)
FROM sys.dm_db_partition_stats
WHERE object_id=OBJECT_ID('MyTable') AND 
(index_id=0 or index_id=1) AND
([DateTime] BETWEEN '2018-04-05' AND '2018-04-06') AND
([Status] = 'Warning')

当我查询dm_db_partition_stats时,以上清除将不起作用,但我想知道是否可以执行某种联接或类似的操作以立即为我提供行的总数,但需要过滤而不是应用于整个桌子。

谢谢。

您是否曾经问过前往人马座的路线? 没有? 答案是,您不能从这里到达那里。

添加索引,重新组织/重新构建,更新统计信息只会使您到目前为止。 您应该考虑改变您的方法。

sp_spaceused通常会立即返回记录计数; 您也许可以使用此功能,但是取决于(您尚未充分提供给我们足够的信息)计数所用的内容可能并不足够。

我不确定您是否要使用此计数作为短路较大操作的方法,或者您如何在应用程序中使用该计数。 当您开始突出显示14亿条记录时,您正在寻找所说集合中的一个窗口时,听起来您可能是分区表的候选人。

这使您可以分配几个较小的表,这些表通常按日期,年/月分隔,作为一个表。 当您在14亿条记录中提供日期范围时,SQL可以满足性能期望。 这确实取决于SQL Edition,但是也有视图分区。

金伯利·特里普(Kimberly Tripp)拥有一个博客和一些视频,肯德拉·利特尔(Kendra Little)也对如何使用它们以及如何进行设置有一些很好的了解。 这将是设计更改。 这有点复杂,不是一时兴起的东西。

这是金伯利博客的链接: https : //www.sqlskills.com/blogs/kimberly/sqlskills-sql101-partitioning/

开发玩笑:

另外,我听说您指责SQL,您是否偶然使用实体框架?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM