簡體   English   中英

Oracle中查詢的優化

[英]Optimization of query in Oracle

從語句更新表。 使用子查詢。 我需要編寫一個使用同一表的更新語句。
我用子查詢來更新多列。 我的例子。

UPDATE  USER_BANCU.REGISTRU_21052016_AE NEW 
        SET  (
             NEW.LIST_COND,
             NEW.LISTA_FOND,
             NEW.GEN_ACT_NE_LIC,
             NEW.GEN_ACT_LIC
             )
           =

         (
    SELECT 
        OLD.LIST_COND,
        OLD.LISTA_FOND,
        OLD.GEN_ACT_NE_LIC,
        OLD.GEN_ACT_LIC
        FROM (
    SELECT 
      VB.IDNO IDNO ,
      trim_vb(VB.LIST_COND)                LIST_COND,
      trim_vb(VB.LISTA_FOND)               LISTA_FOND,
      REPLACE(VB.GEN_ACT_NE_LIC, ' ','' )  GEN_ACT_NE_LIC,  
      REPLACE(VB.GEN_ACT_LIC, ' ','' )     GEN_ACT_LIC    
      FROM   USER_BANCU.REGISTRU_21052016_AE VB
       ) OLD

        WHERE 
            OLD.IDNO=NEW.IDNO 
      )

         WHERE EXISTS (

         SELECT *    
        FROM (
    SELECT 

      VB.IDNO IDNO ,
      trim_vb(VB.LIST_COND)                LIST_COND,
      trim_vb(VB.LISTA_FOND)               LISTA_FOND,
      REPLACE(VB.GEN_ACT_NE_LIC, ' ','' )  GEN_ACT_NE_LIC,  
      REPLACE(VB.GEN_ACT_LIC, ' ','' )     GEN_ACT_LIC

      FROM   USER_BANCU.REGISTRU_21052016_AE VB
       ) OLD


        WHERE 
         OLD.IDNO=NEW.IDNO 
         )

從語句更新表。 使用subbquery。 優化能力? 在這種情況下是否可以創建過程或游標?

運行查詢--ORA-01427時出現錯誤:單行子查詢返回多個行。

您似乎已使該更新過於復雜。 由於您要使用同一張表中的值更新表中的每一行,因此我認為您只是在嘗試這樣做:

update user_bancu.registru_21052016_ae
set    list_cond = trim_vb(vb.list_cond),
       lista_fond = trim_vb(vb.lista_fond),
       gen_act_ne_lic = replace(vb.gen_act_ne_lic, ' '),
       gen_act_lic = replace(vb.gen_act_lic, ' ');

注意,我從replace參數中刪除了'' ,因為在Oracle中,沒有空字符串之類的東西-它被視為null。 並且由於string-to-replace-with參數的默認值為null,因此您可以完全刪除該參數。

同樣,用涉及循環游標的過程替換上面的語句可能會更慢。 如果必須要有一個過程,只需直接在該過程中使用update語句即可。

如果您需要進一步加快速度,而不是上面的update語句,建議您看一下trim_vb函數調用-如果您可以將邏輯直接移到update語句中,那么那應該可以進一步加快速度(當然在12c之前的版本中,DML語句中的用戶定義函數調用涉及SQL和PL / SQL引擎之間的上下文切換,這會減慢速度。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM