2010-12-02 175 views
3

我的問題是類似的,在這個線程的一個構成: How to avoid this very heavy query that slows down the application?Hibernate的索引查詢慢

我們檢查丟失外鍵索引和發現了一些。添加缺失的索引實際上具有相反的效果,因爲它會進一步減慢查詢速度。一條重要信息是我們的客戶有一次Oracle安裝,其中我們的模式複製了21次。每個模式只有1000個表格。我們是否要求太多的Oracle擁有如此大量的表格(當然還有索引)?我不知道他們的硬件是什麼,但我的問題是這是一種合理的方法,還是將用戶分解爲不同的SID會更好?

以下是Hibernate正在執行的查詢。客戶告訴我們,這個查詢在執行時佔用了處理器的45%左右(儘管我不知道該處理多長時間)。

任何建議表示讚賞, 史蒂夫

SELECT NULL AS table_cat, 
     owner AS table_schem, 
     table_name, 
     0 AS non_unique, 
     NULL AS index_qualifier, 
     NULL AS index_name, 
     0 AS TYPE, 
     0 AS ordinal_position, 
     NULL AS column_name, 
     NULL AS asc_or_desc, 
     num_rows AS CARDINALITY, 
     blocks AS pages, 
     NULL AS filter_condition 
    FROM all_tables 
WHERE table_name = 'BOOKING' 
     AND owner = 'FORWARD_TN' 
UNION 
SELECT NULL AS table_cat, 
     i.owner AS table_schem, 
     i.table_name, 
     DECODE (i.uniqueness, 'UNIQUE', 0, 1), 
     NULL AS index_qualifier, 
     i.index_name, 
     1 AS TYPE, 
     c.column_position AS ordinal_position, 
     c.column_name, 
     NULL AS asc_or_desc, 
     i.distinct_keys AS CARDINALITY, 
     i.leaf_blocks AS pages, 
     NULL AS filter_condition 
    FROM all_indexes i, 
     all_ind_columns c 
WHERE  i.table_name = 'BOOKING' 
     AND i.owner = 'FORWARD_TN' 
     AND i.index_name = c.index_name 
     AND i.table_owner = c.table_owner 
     AND i.table_name = c.table_name 
     AND i.owner = c.index_owner 
ORDER BY non_unique, 
     TYPE, 
     index_name, 
     ordinal_position 
+0

處理器在oracle服務器上,還是在應用服務器上? – skaffman 2010-12-02 16:54:38

+0

我應該指定。 Oracle服務器是處理器命中的人。 – 2010-12-02 17:54:39

回答

3

您沒有達到任何一種能力問題與1000個表。在Oracle世界中這仍然相對較小。只要快速檢查我們的電子商務套件安裝,它就有23,000個表格。使用大量CPU的查詢幾乎總是一個執行計劃問題。有些事情要看

您收集了優化器統計信息嗎?沒有他們,優化器可能會對如何執行查詢做出很差的決定。

下一步是看執行計劃本身。如果您正在運行企業管理器,則可能會在首頁耗盡資源。你可以點擊它看看它在做什麼。沒有這個,你必須使用sql_trace或解釋計劃來看看發生了什麼。

1

如果您的所有語句對22.000個表中的每一個使用稍微不同的文字SQL(即無綁定變量),那麼在Oracle服務器上,您可能很容易被excessive parse time命中。如果是這種情況,只需切換到綁定變量,CPU消耗就會大幅降低。

您的客戶能告訴CPU時間花在什麼Oracle功能上嗎? Oracle提供了必要的統計信息。由於據報道CPU消耗是整個實例消耗的重要組成部分,因此您的客戶可以運行statspack報告(如果他已獲得診斷包許可,則可以運行ASH)。這應該顯示CPU時間的確切位置。

0

我們的客戶審查他們的Oracle配置和更改的配置爲以下值: optimizer_index_caching的= 90 OPTIMIZER_INDEX_COST_ADJ = 15 OPTIMIZER_MODE =「選擇」

他們報告說,這似乎已經解決了速度問題。