2012-06-11 93 views
6

我有一條在Oracle數據庫服務器上運行的語句。聲明有大約5個連接,並且沒有什麼不尋常的。它看起來很像如下:使用Oracle提示「FIRST_ROWS」提高Oracle數據庫性能

SELECT field1, field2, field3, ... 
FROM table1, table2, table3, table4, table5 
WHERE table1.id = table2.id AND table2.id = table3.id AND ... 
     table5.userid = 1 

的問題(什麼是有趣的)是用戶ID的發言= 1需要1秒鐘,返回590條記錄。用戶ID = 2的語句大約需要30秒才能返回70條記錄。

我不明白爲什麼差異那麼大。

看來,不同的執行計劃選擇與用戶ID = 1和用戶ID不同的語句= 2

我實施了Oracle提示FIRST_ROW,性能變得更好顯著後。這兩個陳述(對於ids 1和2)都會在1秒內產生回報。

SELECT /*+ FIRST_ROWS */ 
     field1, field2, field3, ... 
FROM table1, table2, table3, table4, table5 
WHERE table1.id = table2.id AND table2.id = table3.id AND ... 
     table5.userid = 1 

問題:
1)什麼是糟糕的表現可能的原因當用戶ID = 2(在不使用提示)?
2)爲什麼一個vs另一個語句的執行計劃會不同(當不使用提示時)?
3)在決定將這個提示添加到我的查詢中時,有什麼需要注意的地方?

感謝

+2

您的餐桌統計信息是否最新且準確? – Tebbe

+0

運行性能比較時請注意緩存。 – tbone

+0

Tebbe - 統計信息是最新的。他們是否準確,我不知道。 – bobetko

回答

8

1)什麼是糟糕的表現可能的原因當用戶ID = 2(在不使用提示)?

因爲Oracle認爲,使用從計劃的臨時結果集的一個(用戶ID = 1),將是非常大的 - 可能不正確。

2)爲什麼一個vs另一個語句(當不使用提示時)執行計劃會不同?基於

直方圖指標

3)有什麼,我應該小心決定此提示添加到我的查詢時?

只要返回的記錄數很少,這個提示就應該是安全的 - 與推動優化器使用特定索引不同,這種方法允許Oracle在索引改變時選擇不同的計劃。

+0

感謝您的快速響應。最令人費解的是,直到1個月前(當我們升級到新版本的Oracle時),我們還沒有6年的這個問題。從那時起,性能開始變得越來越差(對於一些用戶)。在Oracle服務器上是否可以執行任何操作來優化性能?謝謝。 – bobetko

+0

你跟上你的統計數據嗎?確實需要分析是否需要直方圖將是一件好事 – Sebas

+0

您是否正在使用綁定變量並在啓用綁定窺視的情況下切換到DBMS? – symcbean