2011-10-04 154 views
3

我們有一個基於.Net的內部應用程序,它調用Oracle(10g)中的某些過程。其中一個查詢被運行以獲取這些過程的參數。這是一個非常簡單的選擇查詢。但即使在最好的情況下,它也需要3秒。一天至少幾次它會開始超過40秒,並導致我們的.Net應用程序超時。選擇查詢是:Oracle選擇查詢花費太長

SELECT a.argument_name, 
      a.data_type, 
      a.in_out, 
      NVL (a.data_length, 0) AS data_length, 
      NVL (a.data_precision, 0) AS data_precision, 
      NVL (a.data_scale, 0) AS data_scale 
    FROM ALL_ARGUMENTS a, all_objects o 
    WHERE o.object_id = 
       (SELECT object_id 
       FROM all_objects 
       WHERE  UPPER (object_name) = UPPER ('resourcemanager_pkg') 
         AND object_type = 'PACKAGE' 
         AND owner = 'OFFICEDBA') 
      AND UPPER (a.object_name) = UPPER ('p_search_roles') 
      AND a.OBJECT_ID = o.OBJECT_ID 
ORDER BY a.position ASC 

此查詢返回特定過程的輸入/輸出參數。

resourcemanager_pkg是包名稱,p_search_roles是過程名稱。 我們爲每個數據庫調用過程調用此查詢。

這個查詢有什麼問題嗎?任何幫助將不勝感激。請讓我知道是否需要任何其他信息。

感謝, Vikalp耆那教

+0

此查詢是否由'OFFICEDBA'用戶運行?如果是這樣,你可以通過用相應的'USER _...'視圖替換'ALL _...'數據字典視圖來加速它。 –

回答

2

您是否有能力修改正在生成的查詢?看來它正在對ALL_OBJECTS表進行無關聯。看來,你的查詢等效於這個

SELECT a.argument_name, 
      a.data_type, 
      a.in_out, 
      NVL (a.data_length, 0) AS data_length, 
      NVL (a.data_precision, 0) AS data_precision, 
      NVL (a.data_scale, 0) AS data_scale 
    FROM ALL_ARGUMENTS a, 
      (SELECT object_id 
       FROM all_objects 
      WHERE  UPPER (object_name) = UPPER ('resourcemanager_pkg') 
        AND object_type = 'PACKAGE' 
        AND owner = 'OFFICEDBA') o 
    WHERE UPPER (a.object_name) = UPPER ('p_search_roles') 
     AND a.OBJECT_ID = o.OBJECT_ID 
    ORDER BY a.position ASC 

我也期望使用ALL_PROCEDURES而不是ALL_OBJECTS得到OBJECT_ID會更有效。

您是否收集過字典統計信息?針對數據字典視圖的查詢通常很難調整,因爲您無法添加索引或其他結構來加快速度。但至少收集字典統計數據可能會給優化者提供更好的信息,以便能夠選擇更好的計劃。

最後,您是否有可能在物化視圖中實現數據字典中的數據,並定期刷新您可以編制索引的數據?這意味着結果不會立即反映程序定義的變化。另一方面,您通常不希望對實時過程定義進行更改,並且可以在進行模式更改後始終刷新實例化視圖。

0

你真的應該考慮使用Oracle Enterprise Manager監控數據庫。這是一個用戶友好的合理網絡應用程序,可以分析您的所有查詢,並快速告訴您爲什麼您的運行速度很慢。有關詳細信息,請參閱Oracle網站。

我沒有看到任何東西那是錯誤的查詢開始,但它實際上取決於你的表結構,索引和什麼其他負載,併發問題你已經在放緩的時間竟能。

0

查看查詢本身通常很難解決數據庫性能問題。

這裏有您需要按照診斷問題

  • explain plan一些簡單的步驟,這將告訴你在哪裏查詢速度慢
  • 檢查指標,你就UPPER(object_name)得到了一個指數?
  • 檢查你的統計嗎?
3

刪除oracle視圖上所有對UPPER()的調用。他們已經大寫了。我也將包名稱查詢移動到'with子句',因此它被調用一次。

WITH PACKAGE AS 
    (SELECT object_id, owner, object_name NAME 
     FROM all_objects 
     WHERE object_name = UPPER ('SOME_PACKAGE_NAME') 
     AND object_type = 'PACKAGE' 
     AND owner = 'SOME_SCHEMA_OWNER_NAME') 
SELECT a.argument_name, a.data_type, a.in_out, 
     NVL (a.data_length, 0) AS data_length, 
     NVL (a.data_precision, 0) AS data_precision, 
     NVL (a.data_scale, 0) AS data_scale 
    FROM ALL_ARGUMENTS a, PACKAGE 
    WHERE a.package_name = PACKAGE.NAME AND a.owner = PACKAGE.owner 
    --This is the 'procedure' name within the package. 
    AND a.OBJECT_NAME = 'SOME_PROCEDURE_NAME' 
ORDER BY a.POSITION ASC 
0

試試看。我故意留下了UPPER呼叫,因爲如前所述,這將導致索引不被使用。

SELECT a.argument_name, 
     a.data_type, 
     a.in_out, 
     NVL (a.data_length, 0) AS data_length, 
     NVL (a.data_precision, 0) AS data_precision, 
     NVL (a.data_scale, 0) AS data_scale 
from all_arguments a 
    inner join all_objects o ON o.object_id = a.object_id 
where o.object_name = 'resourcemanager_pkg' 
    and o.object_type='PACKAGE' 
    AND O.OWNER = 'OFFICEDBA' 
    AND A.OBJECT_NAME='p_search_roles' 
ORDER BY a.position ASC