我有一個查詢如下;慢SQL性能
SELECT COUNT(Id) FROM Table
該表包含33萬條記錄 - 它包含一個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塊增長。
它是一個活的系統,所以我們在我們可以玩的限制 - 任何想法?
UPDATE:
OK - 我們已經通過相應的列添加新的非聚集索引,所以它不是一個嚴重的問題了改善的實際感興趣的查詢性能。
SELECT COUNT
仍然緩慢,但 - 與NOLOCK提示嘗試了 - 沒有什麼區別。
我們都認爲這與自動增長設置爲1Mb而不是更大的數字有關,但令人驚訝的是它具有這種效果。磁盤上的MDF碎片可能是一個可能的原因?
問題1:你確實需要確切的數量嗎?或者只是一個估計? –
兩者都沒有 - 這只是我們在觀察其他內容的慢速性能之後所執行的查詢。我們很驚訝地發現它太慢了。要嘗試更新統計信息,但他們設置爲自動更新。 – BonyT
你不能只用一個常量嗎?我的意思是,它有3300萬的差異呢?或者它有33.212.293條記錄對你有什麼影響? – bevacqua