2014-12-09 47 views
6

Web uygulama kaynak kodunu değiştirme seçeneğimiz olmadığından, bir bağlama değişkeni olan bir sorgu yeniden yazma uygulaması yapmamız gerekiyor. Örnek:Oracle DBMS_ADVANCED_REWRITE bağlama değişkeni ile nasıl kullanılır?

30353. 00000 - "expression not supported for query rewrite" 
*Cause: The SELECT clause referenced UID, USER, ROWNUM, SYSDATE, 
      CURRENT_TIMESTAMP, MAXVALUE, a sequence number, a bind variable, 
      correlation variable, a set result, a trigger return variable, a 
      parallel table queue column, collection iterator, a non-deterministic 
      date format token RR, etc. 
*Action: Remove the offending expression or disable the REWRITE option on 
      the materialized view. 

orada etrafında bir iştir ama sadece her yerde online belge bulamıyorum here okuyorum: Bir bağlama değişkeni olduğundan Yukarıdaki komut hata ile sonuçlanır

BEGIN 
    SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
    name    => 'test_rewrite2', 
    source_stmt  => 'select COUNT(*) from ViewX where columnA = :1', 
    destination_stmt => 'select COUNT(*) from ViewY where columnA = :1', 
    validate   => FALSE, 
    rewrite_mode  => 'recursive');  
END; 

.

Lütfen etrafındaki işin ne olduğunu söyleyebilir misiniz?

cevap

1

Bağlama parametrelerini belirtemezsiniz, ancak zaten istediğiniz gibi çalışmalıdır. Anahtar, mode olarak geçirdiğiniz recursive parametresidir. recursive ve general modu, filtreyi göz ardı ederek tabloyu (veya görünümü) içeren tüm ifadeleri durduracak ve bunları, filtre koşulunu orijinal bildiriminizden gelen uyarlayarak ikinci tabloyu (veya görüntüyü), hedefleyecek şekilde dönüştürecektir. (eğer TEXT_MATCH olarak tanımlanan olsaydı, dönüşümü tetiklemek için özgün ve hedef açıklamada aynı filtrenin varlığını kontrol olurdu.) Örnekte

bile don eğer biri olduğunu görebilirsiniz Herhangi bir bağlama durumunu tanımlayın, filtre id = 2 nervürsüz uygulanır; başka bir deyişle aslında SELECT * FROM A1 where id = 2 motor şeffaf dönüşümü uygulayarak ve bunun üstüne süzülmüş sonucu

  • dönüyor

    1. görebileceğiniz gibi SELECT * FROM A2 where id = 2

      set LINESIZE 300 
      
      drop table A1; 
      drop view A2; 
      drop index A1_IDX; 
      EXEC SYS.DBMS_ADVANCED_REWRITE.drop_rewrite_equivalence (name => 'test_rewrite'); 
      
      create table A1 (id number, name varchar2(20)); 
      
      insert into A1 values(1, 'hello world'); 
      insert into A1 values(2, 'hola mundo'); 
      
      create index A1_IDX on A1(id); 
      
      select * from A1; 
      
      ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED; 
      
      CREATE OR REPLACE VIEW A2 AS 
      SELECT id, 
           INITCAP(name) AS name 
      FROM A1 
      ORDER BY id desc; 
      
      
      BEGIN 
          SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
          name    => 'test_rewrite', 
          source_stmt  => 'SELECT * FROM A1', 
          destination_stmt => 'SELECT * FROM A2', 
          validate   => FALSE, 
          rewrite_mode  => 'recursive'); 
      END; 
      /
      
      
      select * from A1; 
      
           ID NAME    
      ---------- -------------------- 
           2 Hola Mundo   
           1 Hello World   
      
      
      
      
      select * from A1 where id = 2; 
      
      
           ID NAME    
      ---------- -------------------- 
           2 Hola Mundo  
      
      
      explain plan for 
      select * from A1 where id = 2; 
      
      select * from table(dbms_xplan.display); 
      
      
      PLAN_TABLE_OUTPUT                                                                       
      ---------------------------------------------------------------------------------------- 
      Plan hash value: 1034670462                                                                     
      
      ----------------------------------------------------------------------------------------                                                      
      | Id | Operation      | Name | Rows | Bytes | Cost (%CPU)| Time  |                                                      
      ----------------------------------------------------------------------------------------                                                      
      | 0 | SELECT STATEMENT    |  |  1 | 25 |  2 (0)| 00:00:01 |                                                      
      | 1 | VIEW       | A2  |  1 | 25 |  2 (0)| 00:00:01 |                                                      
      | 2 | TABLE ACCESS BY INDEX ROWID | A1  |  1 | 25 |  2 (0)| 00:00:01 |                                                      
      |* 3 | INDEX RANGE SCAN DESCENDING| A1_IDX |  1 |  |  1 (0)| 00:00:01 |                                                      
      ----------------------------------------------------------------------------------------                                                      
      
      
      PLAN_TABLE_OUTPUT                                                                       
      --------------------------------------------------- 
      Predicate Information (identified by operation id):                                                               
      ---------------------------------------------------                                                               
      
          3 - access("ID"=2)                                                                      
      
      Note                                                                           
      -----                                                                          
          - dynamic sampling used for this statement (level=2)                                                              
          - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold                                                      
      
      20 rows selected 
      

      içine dönüşümü dönüştürüyor filtresine uygulanır. Filtre, A1 değerlerini ayıklamak için kaynak tabloya doğru "itilir". A2'nin tüm değerlerini körü körüne ayıklamak değil ve daha sonra filtreyi uygulamak, böylece performans korunur.

  • İlgili konular