2012-08-29 67 views
0

假設我們有這樣的查詢:強制使用索引可以提高性能?

select a.col1, b.col2 
from t1 a 
inner join t2 b on a.col1 = b.col2 
where a.col1 = 'abc' 

兩個col1col2沒有任何指標。


如果我添加其他限制在where子句中,一個是永遠正確的,但與索引中的列:

select a.col1, b.col2 
from t1 a 
inner join t2 b on a.col1 = b.col2 
where a.col1 = 'abc' 
and a.id >= 0 -- column always true and with index 

可能的查詢執行得更快,因爲它可以使用指數id專欄?

+2

除非'和a.id> = 0'減少行的數量,可能不是 – dfb

+1

這有可能是存在被在優化器不會選擇用於第一第二種情況下使用的索引。例如,對於表't1'列上的複合索引'id'和'col1'可能不會出現在幫助第一查詢,但允許第二查詢,以減少I/O由於索引條目的(假設的)更大的密度每頁相比每頁錶行數。 – HABO

+0

@HABO很好看,可能是這樣的! –

回答

2

使用id上的索引做什麼?

這裏最昂貴的位是連接列上的連接,而id與此無關。

最有可能的情況,它沒有區別。

可能的結果:這使得它需要更多的,因爲它沒有制定出id總是大於零,所以它是一個索引掃描,以找到正確的行,然後從獲取它會在同一行已經從表格掃描中獲得(如果有覆蓋所述列的INCLUDE,則會有所不同)。奇怪的結果是:在數據庫優化的世界裏發生了一些奇怪的事情,所以如果它有幫助我就不會吃我的帽子,但我仍然會大吃一驚。

真的,儘管如此,用不相關的索引強迫無關的工作並不會幫助你的事業。

編輯:其實我想到了一個可以提供幫助的例子。在沒有直接相關的情況下,SQLServer通常會使用一些索引來尋找,因爲即使在這種情況下,查找通常比掃描要好。如果由於某種原因,尋求更好,並由於某種原因選擇了另一種尋找方式,迫使尋求一個不同的指數可能會使只是。儘管如此,我仍然很驚訝。

+0

好,感謝沃爾特·懷特:P我已經把這個問題,因爲有些人在DB2使用它在這裏的銀行,以及由於某種原因,它的速度更快... –

+1

@aF。沃特·懷特?啊,我想這比Anton LaVey好。 –

+0

你能分析它爲什麼有幫助嗎?我記得'where id = id'有足夠類似的原因幫助查詢一次,但認爲這已經成爲過去。 (此外,只需添加真正有用的索引)。 –

1

可能(但不可能)。這完全取決於查詢優化器評估您查詢的方式。更好的選擇是使用提示。

1

我認爲這會變得更糟。因爲如果它在這裏使用索引來檢索所有行,那麼與簡單檢索所有行相比,這是額外的工作。

1

問題的答案是肯定的,如果它過濾掉足夠多的表a行,它可以提高性能。