2010-04-23 88 views
1

我們在處理選擇語句時接近3500(!!)綁定變量時,我們的oracle服務器窒息。帶有大量綁定變量的oracle select的影響/限制是什麼?

這個選擇顯然是由我們無法更改的代碼動態構建的。在執行此選擇期間,數據庫服務器的CPU使用率達到100%,我們的系統幾乎停止。

我們知道如何重現此問題。所以我們可以防止這個特定的情況。但我想知道是否有一種方法來保護數據庫(通過配置)從這種類型的問題。

更新

的選擇看起來像這樣:

SELECT "FieldOfChar20" 
FROM "TableOf111Krows" 
WHERE ( "FieldOfChar20" BETWEEN :a0 AND :a1 
    OR "FieldOfChar20" BETWEEN :a2 AND :a3 
    OR "FieldOfChar20" BETWEEN :a4 AND :a5 
    snip snip 
    OR "FieldOfChar20" BETWEEN :a290 AND :a291 
    OR "FieldOfChar20" BETWEEN :a292 AND :a293 
    ) 
OR ( "FieldOfChar20" IN 
      (:a294, 
      :a295, 
      snip snip 
      :a1292, 
      :a1293 
     ) 
    OR "FieldOfChar20" IN 
      (:a1294, 
      :a1295, 
      snip snip 
      :a2292, 
      :a2293 
     ) 
    OR "FieldOfChar20" IN 
      (:a2294, 
      :a2295, 
      snip snip 
      :a3292, 
      :a3293 
     ) 
    OR "FieldOfChar20" IN 
      (:a3294, 
      :a3295, 
      snip snip 
      :a3476, 
      :a3477 
     ) 
    ) 

Oracle版本爲10.2.0.2

回答

3

在Oracle 8和更高版本,可以create usage profiles控制和限制任何一個會話都可以使用的資源。您可以創建一個配置文件並將其與用戶或角色相關聯,數據庫將確保像邏輯/物理IO,CPU和其他有限資源更公平地共享。

輪廓的有趣的位包括:

[CPU_PER_SESSION   n|UNLIMITED|DEFAULT]  
[CPU_PER_CALL    n|UNLIMITED|DEFAULT]    
[CONNECT_TIME    n|UNLIMITED|DEFAULT] 
[IDLE_TIME     n|UNLIMITED|DEFAULT] 
[LOGICAL_READS_PER_SESSION n|UNLIMITED|DEFAULT] 
[LOGICAL_READS_PER_CALL n|UNLIMITED|DEFAULT] 
[COMPOSITE_LIMIT   n|UNLIMITED|DEFAULT] 
[PRIVATE_SGA    n [K|M]|UNLIMITED|DEFAULT] 

對於綁定變量,我不知道的任何方式對數據庫或OCI客戶端限制使用這些。實際上,綁定變量通常比SQL中的嵌入值更適合性能(和安全性)。具體而言,減少數據庫在執行SQL時必須執行的硬解析的數量,該SQL僅在參數值中變化。

1

由於您有3500個綁定變量,這聽起來像是一個大規模的查詢。我會假設查詢的複雜性(連接到表/視圖,子查詢等等)比擁有這些綁定變量更麻煩。必須檢查每個連接的索引(如果有索引)。當第一次提交查詢時,必須構建執行計劃,聽起來像甲骨文正在窒息。

但是,一旦計劃建立,它被存儲在內存中,不需要重建(感謝綁定變量)。所以擁有大量的綁定變量可能不是一件壞事。

+0

我已將select添加到問題中。這很簡單。 – 2010-04-25 07:35:08

1

查詢是什麼樣的?

我想這是一個「變量列表」查詢,如其中id在(:1,:2,:3,.....)查詢?

 select /*+ cardinality(tab 10) */ * 
     from employees, table(:1) tab 
     where employees.id = tab.column_value"; 

這裏更多:http://forums.oracle.com/forums/thread.jspa?messageID=3855830&#3855830

是結合的總數量相同或者是它總是不同

該應用程序的開發人員應該有一個記憶集已加入?有時3500,有時3499,有時3520 ...?

如果綁定數量不同,則不會從緩存中檢索查詢的執行計劃。

+0

我已將查詢添加到問題中。變化的數量。 – 2010-04-25 07:36:24

+0

該查詢需要重寫。 Oracle散列每個sql語句,因此綁定次數的每次更改都意味着不同的散列值,並且不會在緩存中重用執行計劃。 – TTT 2010-04-25 12:08:12