我有一个以下的查询;
SELECT COUNT(Id) FROM Table
该表包含3300万条记录 - 它在Id上有一个主键,没有其他索引。
查询需要30秒钟。
实际执行计划显示它使用了聚集索引扫描。
我们已经分析了该表,并发现它不是通过此链接中显示的第一个查询片段进行碎片化:http://sqlserverpedia.com/wiki/Index_Maintenance。
有什么想法,为什么这个查询如此缓慢以及如何修复它。
表定义:
CREATE TABLE [dbo].[DbConversation](
[ConversationID] [int] IDENTITY(1,1) NOT NULL,
[ConversationGroupID] [int] NOT NULL,
[InsideIP] [uniqueidentifier] NOT NULL,
[OutsideIP] [uniqueidentifier] NOT NULL,
[ServerPort] [int] NOT NULL,
[BytesOutbound] [bigint] NOT NULL,
[BytesInbound] [bigint] NOT NULL,
[ServerOutside] [bit] NOT NULL,
[LastFlowTime] [datetime] NOT NULL,
[LastClientPort] [int] NOT NULL,
[Protocol] [tinyint] NOT NULL,
[TypeOfService] [tinyint] NOT NULL,
CONSTRAINT [PK_Conversation_1] PRIMARY KEY CLUSTERED
(
[ConversationID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
我注意到一个问题,即数据库设置为每次增长1MB。这是一个实时系统,所以我们受限于我们可以尝试的内容-有什么想法吗?
更新:
好的,我们通过在适当的列上添加新的非聚集索引来改善了感兴趣的查询的性能,因此这不再是一个关键问题。
SELECT COUNT
仍然很慢-尝试使用NOLOCK提示-没有区别。我们都认为这可能与自动增长设置为1MB而不是更大的数字有关,但很惊讶它会产生这种影响。磁盘上的MDF碎片可能是可能的原因吗?
COUNT
来诊断慢速性能并不是很有启发性。您可以打开一个新问题,附上实际问题以及可能的执行计划和/或IO统计信息吗? - JNK