Nghe có vẻ giống như gói DBMS_ADVANCED_REWRITE . Tim Hall có một hướng dẫn tuyệt vời về việc sử dụng gói đó để trỏ các truy vấn của ứng dụng vào một bảng hoặc dạng xem khác .
Nếu bạn chỉ muốn thay đổi kế hoạch truy vấn nhưng không trỏ truy vấn vào một bảng khác, bạn có thể sử dụng các phác thảo được lưu trữ hoặc các cấu hình SQL.
Ví dụ: tôi có các bảng FOO
có 1 hàng và BAR
có 2 hàng
SQL> select * from foo;
COL1
----------
1
SQL> select * from bar;
COL1
----------
66
77
Tôi có thể khai báo một tương đương viết lại nói rằng các truy vấn chống lại FOO
thay vào đó nên nhấnBAR
begin
sys.DBMS_ADVANCED_REWRITE.DECLARE_REWRITE_EQUIVALENCE(
'Rewrite_Foo',
'select col1 from foo',
'select col1 from bar',
false,
'TEXT_MATCH' );
end;
Bây giờ, nếu tôi đặt query_rewrite_integrity
thành tin cậy, các truy vấn chống lại việc FOO
kết thúc một bảng hoàn toàn khác.
SQL> alter session set query_rewrite_integrity=trusted;
Session altered.
SQL> select * from foo;
COL1
----------
66
77
Điều đó có thể tạo ra một số kế hoạch truy vấn khá thú vị trong đó đối tượng bạn đang truy vấn không tìm thấy trong kế hoạch
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