Oracle 10g의 SQL 대체 기능


9

3 ~ 4 년 전에 DBA가 긴급 사고 해결을 위해 실시간 SQL 대체의 Oracle 10g 기능을 사용한 Oracle 블로그를 읽었습니다. 기본적으로 그는 특정 쿼리 A를받을 때마다 다른 쿼리 B를 대신 실행하도록 Oracle을 구성했습니다. 응용 프로그램 코드 변경, 스키마 변경 없음, 단순한 "A 대신 쿼리 B 실행"유형의 구성.

그 기능을 사용할 계획은 아니지만 (원치 않는 결과를 생각할 수 있음) 호기심에서 실제로 존재합니까? 그렇다면 그 기능은 무엇입니까?


저장된 개요
Philᵀᴹ


1
@ 필 : 저장된 개요는 실행 계획만을위한 것이라고 생각했습니다. OP를 사용하여 실제 쿼리를 대체하는 데 사용할 수 있습니까?
FrustratedWithFormsDesigner

1
예, 아웃 라인을 사용하여 SQL 텍스트를 변경할 수 있습니다. 나는 9i에서 전에 힌트를 추가하기 위해 쿼리를 수정하기 위해이 작업을 수행했습니다. 이것은 실용적인 방법을 보여줍니다 : actualappsdba.wordpress.com/2007/05/18/…- 입력 및 출력이 동일하게 유지되는 한 쿼리를 변경할 수없는 이유를 알 수 없습니다-개요가 평가 및 대체됩니다 구문 분석 시간
Philᵀᴹ

1
쿼리 다시 쓰기가 활성화 된 구체화 된 뷰일 수도 있습니다.
a_horse_with_no_name

답변:


4

DBMS_ADVANCED_REWRITE 패키지 처럼 들립니다 . Tim Hall은 해당 패키지를 사용하여 응용 프로그램의 쿼리를 다른 테이블이나 뷰에 대해 지적 하는 훌륭한 연습을 제공합니다 .

쿼리 계획을 변경하려고하지만 쿼리를 다른 테이블을 가리 키지 않으려면 저장된 개요 또는 SQL 프로필을 사용할 수 있습니다.

예를 들어 FOO1 행과 BAR2 행의 테이블 이 있습니다.

SQL> select * from foo;

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

SQL> select * from bar;

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

쿼리 FOO가 대신 맞아야한다고 말하는 다시 쓰기 동등성을 선언 할 수 있습니다BAR

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

이제 query_rewrite_integrity신뢰할 수 있도록 설정 하면 쿼리 FOO가 완전히 다른 테이블에 도달합니다.

SQL> alter session set query_rewrite_integrity=trusted;

Session altered.

SQL> select * from foo;

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

그러면 쿼리하려는 개체가 계획에서 찾을 수없는 흥미로운 쿼리 계획을 만들 수 있습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.