Tính năng thay thế SQL trong Oracle 10g


9

Ba hoặc bốn năm trước tôi đã đọc trong một blog của Oracle ở đâu đó rằng một DBA đã sử dụng cho một sự cố khẩn cấp giải quyết một tính năng Oracle 10g thay thế SQL thời gian thực. Về cơ bản, anh ta đã cấu hình Oracle theo cách mà mỗi lần nhận được một truy vấn nhất định A, nó lại thực hiện một truy vấn B khác. Không thay đổi mã ứng dụng, không thay đổi lược đồ, chỉ là loại cấu hình "thực hiện truy vấn B thay vì A" đơn giản.

Không phải là tôi đang dự định sử dụng tính năng đó (tôi có thể nghĩ ra một số hậu quả không mong muốn), nhưng vì tò mò liệu nó có thực sự tồn tại? Nếu có, tính năng đó được gọi là gì?




1
@Phil: Tôi nghĩ rằng phác thảo được lưu trữ chỉ dành cho kế hoạch thực hiện. Có thể sử dụng chúng để thay thế các truy vấn thực tế theo cách OP mô tả không?
Thất vọngWithFormsDesigner

1
Có, bạn có thể thay đổi văn bản SQL bằng cách sử dụng Đề cương. Tôi đã làm điều này trước đây trong 9i để sửa đổi một truy vấn để thêm một vài gợi ý. Điều này cho thấy cách thức thực hiện: Realisticappsdba.wordpress.com/2007/05/18/ Từ - Tôi không hiểu lý do tại sao bạn không thể thay đổi truy vấn miễn là đầu vào và đầu ra vẫn giữ nguyên - các phác thảo được đánh giá & thay thế vào lúc phân tích cú pháp
Philᵀᴹ

1
Cũng có thể là một khung nhìn cụ thể hóa với kích hoạt viết lại truy vấn.
a_horse_with_no_name

Câu trả lời:


4

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 FOOcó 1 hàng và BARcó 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 FOOthay 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_integritythành tin cậy, các truy vấn chống lại việc FOOkế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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.