对不起各位,我现在只是检查问题:我有一个包含超过 30,000,000 行的大表。我需要一种快速可靠的方法来计算该表中包含的行数。
但它适用于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 毫秒或更短?
最佳答案
为你的索引尝试这样的结构
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]
您的执行计划应该类似于 注意引用的 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/