2015-01-13 55 views
4

我有一個簡單的查詢:當我添加Where子句時會出現什麼問題?

Select Distinct BOLTYPENAME, BOLTYPE.BOLTYPE From BOLTYPE 
Inner Join WORKORDER on WORKORDER.BOLTYPE=BOLTYPE.BOLTYPE 
Inner Join BOLMAIN On BOLMAIN.BOLID=WORKORDER.BOLID 
Where BOLMAIN.CORID=156 

當我運行此查詢沒有「如果」的條款,它需要0.1秒。但添加where子句會導致它需要1分鐘才能返回。所有的表都有相關的索引,並且它們已經被拆分。這三個表中的行數是:

BOLTYPE:11行

BOLMAIN:71455行

工單:197500行

下面是執行計劃:

Where Where條款(0.1秒):

Without where clause

隨着在where子句(60秒):

With Where Clause

任何想法,可能是什麼問題?

更新:這裏是相關指數的定義:

CREATE NONCLUSTERED INDEX [BOLIDX] ON [dbo].[WORKORDER] 
([BOLID] ASC) 
GO 

CREATE NONCLUSTERED INDEX [CORIDX] ON [dbo].[BOLMAIN] 
([CORID] ASC) 
INCLUDE ([BOLID]) 
GO 

CREATE NONCLUSTERED INDEX [BOLTYPEIDX] ON [dbo].[WORKORDER] 
([BOLTYPE] ASC) 
GO 
+0

這也採取同樣的時間? SELECT DISTINCT BOLTYPENAME,BOLTYPE.BOLTYPE從BOLTYPE,工單,BOLMAIN 其中WORKORDER.BOLTYPE = BOLTYPE.BOLTYPE AND BOLMAIN.BOLID = WORKORDER.BOLID AND BOLMAIN.CORID = 156 – Varun

+0

是。它正在採取同一時間。 – navigator

+0

您的索引看起來不正確。你可以編輯他們的定義嗎? – Luaan

回答

1

重新創建CORIDX指數,使其覆蓋BOLID。您加入BOLID,因此您希望它成爲索引的一部分,而不僅僅是包含的列之一。

換句話說:

CREATE NONCLUSTERED INDEX [CORIDX] ON [dbo].[BOLMAIN] 
([CORID] ASC, [BOLID] ASC) 
+0

或者只是創建兩個單獨的索引。它看起來不像是一個多列索引的好例子。 – Luaan

+1

他已經有兩個單獨的索引。當沒有WHERE子句時,優化器使用PK_BOLMAIN,我打賭它是在BOLID上。所以他在BOLID上有PK_BOLMAIN,在CORID上有CORIDX。我認爲一個多列索引將消除表假脫機並加速嵌套循環。 –

+0

令人驚歎!這解決了它!我不知道移動一列成爲索引的一部分,而不是將它包括在索引中會產生如此的差異!非常感謝! – navigator