Oracle 10g'de SQL değiştirme özelliği


9

Üç veya dört yıl önce, bir DBA'nın acil bir olay çözümü için gerçek zamanlı SQL yerine Oracle 10g özelliği kullandığı bir yerde bir Oracle blogunda okudum. Temel olarak, Oracle'ı belirli bir A sorgusu her aldığında bunun yerine başka bir B sorgusu yürütecek şekilde yapılandırdı. Uygulama kodu değişikliği yok, şema değişikliği yok, sadece basit bir "A sorgusu yerine B sorgusunu yürütün".

Bu özelliği kullanmayı planladığımdan değil (bazı istenmeyen sonuçları düşünebilirim), ama meraktan gerçekten var mı? Evet ise, bu özelliğin adı nedir?


Kayıtlı ana hatlar
Philᵀᴹ


1
@Phil: Depolanmış ana hatların yalnızca yürütme planları için olduğunu düşündüm. Bunları OP'nin açıkladığı şekilde gerçek sorguları değiştirmek için kullanmak mümkün müdür?
SinirliWithFormsDesigner

1
Evet, Anahatlar'ı kullanarak SQL metnini değiştirebilirsiniz. Bunu birkaç ipucu eklemek için bir sorgu değiştirmek için 9i önce yaptım. Bu nasıl yapıldığını gösterir: practicalappsdba.wordpress.com/2007/05/18/… - Giriş ve çıkış aynı kaldığı sürece sorguyu neden değiştiremediğinizi anlamıyorum - ana hatlar değerlendirildi ve değiştirildi ayrıştırma zamanında
Philᵀᴹ

1
Sorgu yeniden yazma özelliği etkinleştirilmiş bir materyal görünümü de olabilir.
a_horse_with_no_name

Yanıtlar:


4

DBMS_ADVANCED_REWRITE paketi gibi geliyor . Tim Hall, bir uygulamanın sorgularını farklı bir tabloya veya görünüme yönlendirmek için bu paketi kullanma konusunda mükemmel bir incelemeye sahiptir .

Yalnızca sorgu planını değiştirmek ancak sorguyu farklı bir tabloya yönlendirmek istemiyorsanız, saklanan anahatları veya SQL profillerini kullanabilirsiniz.

Örneğin, FOO1 satırlı ve BAR2 satırlı tablolarım var

SQL> select * from foo;

      COL1
----------
         1

SQL> select * from bar;

      COL1
----------
        66
        77

Karşı sorguların FOOyerine isabet etmesi gerektiğini söyleyen bir yeniden yazma denkliği beyan edebilirimBAR

begin
  sys.DBMS_ADVANCED_REWRITE.DECLARE_REWRITE_EQUIVALENCE(
    'Rewrite_Foo',
    'select col1 from foo',
    'select col1 from bar',
    false,
    'TEXT_MATCH' );
end;

Şimdi, query_rewrite_integritygüvenilir olarak ayarlanırsam , karşı sorgular FOOtamamen farklı bir tabloya çarpıyor.

SQL> alter session set query_rewrite_integrity=trusted;

Session altered.

SQL> select * from foo;

      COL1
----------
        66
        77

Bu, sorguladığınız nesnenin planda hiçbir yerde bulunmadığı oldukça ilginç sorgu planları oluşturabilir

SQL> select * from foo;

      COL1
----------
        66
        77


Execution Plan
----------------------------------------------------------
Plan hash value: 4224476444

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     2 |    26 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| BAR  |     2 |    26 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          7  consistent gets
          0  physical reads
          0  redo size
        584  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.