SQL 服务器 : quickly retrieve row count for large table using where query

标签 sql sql-server database

对不起各位,我现在只是检查问题:我有一个包含超过 30,000,000 行的大表。我需要一种快速可靠的方法来计算该表中包含的行数。

一个好的方法是:http://blogs.msdn.com/b/martijnh/archive/2010/07/15/sql-server-how-to-quickly-retrieve-accurate-row-count-for-table.aspx

但它适用于WHOLE 表。我的 SQL 语句如下所示:

select COUNT(*) 
from HistoryData 
where Port = 6021 
  and RecvTime > '2015-04-13' 
  and RecvTime < '2015-04-14 15:00:00'

这个查询的结果是18615883

  • CPU 时间为 3094 毫秒
  • 持续时间为30429 毫秒

我的表在 (RecvTime, Port) 上有一个索引。索引脚本是:

/****** Script Date: 04/14/2015 15:54:04 ******/
ALTER TABLE [dbo].[HistoryData] 
ADD  CONSTRAINT [PK_HistoryData] PRIMARY KEY CLUSTERED 
(
    [Port] ASC,
    [RecvTime] ASC
)

我能否将耗时减少到 5000 毫秒或更短?

SQL执行计划:http://i.stack.imgur.com/hsYVb.jpg

最佳答案

为你的索引尝试这样的结构

CREATE NONCLUSTERED INDEX [IX_HistoryData] ON [dbo].[HistoryData]
(
    [Port] ASC,
    [RecvTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

您的执行计划应该类似于 this plan注意引用的 IX_HistoryData 而不是 PK_HistoryData

附言。您的表非常简单,我可以轻松地创建测试数据,但我只有一个本地 SQL Server(在 SSD 上运行),结果无论如何都不相关。

关于SQL 服务器 : quickly retrieve row count for large table using where query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29620902/

相关文章:

sql - 如何选择最近的值?

.net - 将 DateTime 解析为 SQL Server 的最佳方法

sql-server - 在 SQL 表中存储表情符号

sql - 如何在 SQL Server 2008 中将格式为 "property:value,property2:value"的字符串转换为 xml

mysql - 将 CONCAT 与 GROUP_CONCAT 结合使用

java - Cassandra 数据库 : Storing XML-Files in Cassandra Database possible?

php - 更改 mysql 中的所有列 - 可拖动框

java - c3p0 连接池,无需在 checkin 或 checkout 时进行测试

sql - 左外连接与嵌套聚合选择查找表中最新行的好处是什么?

mysql - 如果表按日期排序,如何在 MySQL 上选择特定行之前的行?