SQL Server:使用查询位置快速检索大表的行数

时间:2015-04-14 06:50:45

标签: 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 ms
  • 持续时间 30429 ms

我的表上有一个索引(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

1 个答案:

答案 0 :(得分:3)

为索引尝试这样的结构

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

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