2011-09-09 61 views
5

我在尋找爲什麼在表的外鍵上添加索引正在放慢我的同事的觀點,這是相當困難的時候。這個視圖由幾個包含外部聯接和內部聯接的視圖組成。我試圖一個一個去除它們以找出問題出在哪裏,但我不能說,它似乎不是來自特定的觀點,而是來自它們的更多。索引如何減慢select語句?

我知道索引可能會降低插入速度,或者說他們在硬盤上佔用了大小,但我從來沒有讀過任何他們可能會放慢視圖速度的負擔。事實是,當我這樣做:

DBCC FREEPROCCACHE 
DBCC DROPCLEANBUFFERS 
GO 

select top 20 * from MyView 

它需要20秒的索引和9沒有。

CREATE NONCLUSTERED INDEX [IX_MyField] ON [dbo].MyTable 
(
    [MyField] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
    IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
+1

您是否看過查詢計劃以瞭解發生了什麼? –

+0

理論上,索引使優化程序在構建計劃時考慮更多選項,如果它決定需要進行表掃描,則可能會降低計劃速度。但是,我懷疑這會有什麼可衡量的效果。你能發佈受影響的查詢嗎? – JohnFx

+0

您是否認爲該視圖是調用視圖的視圖(或者是我誤解了)?如果需要,你需要立即停止。這些觀點必須充分實現所有較低視圖的工作,並且在涉及大量數據時非常緩慢。這是一個SQL反模式,可以查看調用其他視圖。 – HLGEM

回答

9

您的其他索引或統計信息可能已過時。如果它們不是最新的,那麼查詢分析器可能會使用新索引選擇次優執行計劃,因爲它認爲它會更快。

嘗試運行:

UPDATE STATISTICS WITH (FULLSCAN)

你的桌子上。

+1

那岩石夥計!你救了我的一週! – Arthis

+1

高興地幫助,並很高興它的工作。像這樣的問題很多時候都是一種痛苦。 – JNK

2

您是否從MyTable中選擇任何其他列?如果是這樣,您可能正在執行書籤查找(或查找RID),這意味着您將返回到您的表以獲取額外的數據。

您應該在索引的INCLUDE子句中另外選擇任何列。

運行啓用了執行計劃的兩個查詢並比較2,以確定查詢的哪些部分需要更長的時間。

+0

感謝您的解釋,它沒有解決我的問題,但有助於我更深入地瞭解索引的工作原理。祝你今天愉快! – Arthis