2009-12-03 198 views
1

要優化SELECT查詢,我運行它們都有或沒有索引,並測量差異。我運行了一堆不同的類似查詢,並嘗試選擇不同的數據以確保緩存不會影響結果。但是,在非常大的表上,索引需要很長時間才能創建,而且我對於哪些索引是合適的有幾個不同的想法。關閉Oracle中的索引

是否有可能在Oracle(或其他任何數據庫)中執行查詢但告訴數據庫在執行查詢時不使用某個索引?或者只是完全關閉索引,但是能夠輕鬆地將其切換回來,而無需重新索引整個表格?這將使測試更容易,因爲我可以一次創建所有我正在考慮的索引,然後使用不同的索引來查詢我的查詢。

或者,有沒有更好的方法可以優化大表上的查詢,並知道哪些索引最適合創建?

+1

當你說「查詢」時,你是專指'SELECT'查詢還是'UPDATE'和'INSERT'?通常它是'INSERT',它的性能會受到索引的負面影響。 'SELECT'通常會提高其性能。 – 2009-12-03 14:49:27

+0

好點 - 我實際上是在討論優化SELECT查詢,我已經編輯我的問題來澄清這一點。我的目標是將我的SELECT查詢優化爲可接受的級別,索引數量最少,因爲更多索引會傷害我的更新和刪除。 – 2009-12-03 14:58:50

回答

9

您可以設置指標的知名度在11g中 -

ALTER INDEX idx1 [ INVISIBLE | VISIBLE ] 

這使得它無法使用優化器,但甲骨文仍然更新數據時添加或刪除索引。這樣可以很容易地在禁用索引的情況下測試性能,而不必刪除&重建整個索引。

對指數的知名度在Oracle文檔見here

3

您可以在查詢中使用NO_INDEX提示來忽略索引 - 有關更多詳細信息,請參閱文檔。 SQL Access Advisor是一個Oracle實用程序,它將推薦索引策略。

+1

更準確地說,SQL Access Advisor是Tuning Pack的一部分,這是* Enterprise Edition許可證的*額外費用*。 – APC 2009-12-04 10:59:50

+1

此外,調整包依賴於診斷包,這也是一個*收費額外*。所以SQL Access Advisor是一個非常昂貴的選擇,並不是每個Oracle商店都會有。 – APC 2009-12-04 11:06:17

+0

@APC - 正確,並且很好記 – dpbradley 2009-12-04 12:21:36

3

那麼你可以以這樣一種方式,它不會使用索引(使用表達式而不是值)

例如

Select * from foobar where column1 = 'result' --uses index on column1 
編寫查詢

爲了避免使用索引爲一個數和varchar

Select * from foobar where column1 + 0 = 5 -- simple expression to disable the index 

Select * from foobar where column1 || '' = 'result' --simple expression to disable the index 

或者你可以使用NVL禁用查詢索引,而無需擔心列的數據類型

Select * from foobar where nvl(column1,column1) = 'result' --i love this way :D 

同樣可以使用索引提示

/* Index(E employee_id) */使用索引。 P.S.這是從Dan Tow的Book SQL Tuning中解釋出來的。我幾天前開始閱讀它:)