Thứ Tư, 12 tháng 10, 2022

Sử dụng quản lý kế hoạch SQL (SQL Plan Management - SPM) để kiểm soát kế hoạch thực thi SQL trong Oracle Database

Quản lý plan SQL (SQL Plan Management - SPM) được thiết kế để ngăn chặn suy giảm hiệu suất cho tất cả các câu lệnh SQL được ứng dụng sử dụng (giả sử rằng các câu lệnh SQL được đề cập được sử dụng nhiều lần). SPM sử dụng các SQL plan baselines được liên kết với các câu lệnh SQL riêng lẻ để kiểm soát những plan (plan) thực thi nào chúng được phép sử dụng. Đó là một ý tưởng đơn giản nhưng mạnh mẽ mở ra cánh cửa khả năng sử dụng SQL plan baselines theo cách phản ứng và chọn lọc hơn: để tác động đến plan thực thi SQL của các truy vấn riêng lẻ mà không cần phải sửa đổi các truy vấn ứng dụng hoặc thay đổi chính ứng dụng. Kỹ thuật này được đề cập trong các blog và trong bài viết SPM ở đây , nhưng nó xứng đáng có một bài đăng riêng cùng với một ví dụ FULL. 


Nếu bạn muốn tránh đọc tất cả thông tin cơ bản bên dưới và chuyển sang một ví dụ thực tế, thì tham khảo GitHub . Chúng tương tự như các ví dụ về SQL Profile được Oracle Support xuất bản vài năm trước và chúng chứng minh cách bạn có thể truy xuất các plan từ bộ điều chỉnh SQL và AWR. Chúng sẽ hoạt động trong Oracle Database 12c Release 2 trở đi (và thậm chí trên Oracle Database 18c, 19c, 21c Standard Edition). Ví dụ mã khác bên dưới sẽ hoạt động trong Cơ sở dữ liệu Oracle 11g trở đi.

Hãy xem xét tình huống mà bạn có một câu lệnh SQL được sử dụng bởi một ứng dụng có plan dưới mức tối ưu và bạn cần phải làm gì đó với nó. Để tranh luận, hãy giả sử rằng bạn biết rằng có một hint mà bạn có thể sử dụng để đạt được một plan tốt hơn. Từ bây giờ tôi sẽ giả định rằng bạn muốn áp dụng một hint nhưng mã ứng dụng không thể thay đổi theo bất kỳ cách nào.

Hãy xem plan thực thi SQL sau. Đó là một truy vấn ứng dụng lọc các row bảng SALES bằng cách sử dụng chỉ mục (index):

SQL> SELECT *

  2  FROM table(DBMS_XPLAN.DISPLAY_CURSOR(sql_id=>'f23qunrkxdgdt'));

 

PLAN_TABLE_OUTPUT

-----------------

SQL_ID  f23qunrkxdgdt, child number 2

-------------------------------------

select sum(num) from sales where id < :idv


Plan hash value: 2327341677

-------------------------------------------------------

| Id  | Operation                            | Name   |

-------------------------------------------------------

|   0 | SELECT STATEMENT                     |        |

|   1 |  SORT AGGREGATE                      |        |

|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| SALES  |

|*  3 |    INDEX RANGE SCAN                  | SALESI |

-------------------------------------------------------

Nếu plan này không tối ưu thì sao? Nó tối ưu trong trường hợp này, nhưng ví dụ, tôi sẽ giả sử rằng tôi muốn Oracle Optimizer chọn quét toàn bộ bảng thay thế. Tất cả những gì chúng ta cần là dùng hint FULL:

PLAN_TABLE_OUTPUT

-----------------

SQL_ID  82x4tj3z2vg23, child number 0

-------------------------------------

select /*+ FULL(sales) */ sum(num) from sales where id < :idv

 

Plan hash value: 1047182207

------------------------------------

| Id  | Operation      | Name  |

------------------------------------

|   0 | SELECT STATEMENT   |   |

|   1 |  SORT AGGREGATE |   |

|*  2 |   TABLE ACCESS FULL| SALES |

------------------------------------

Truy vấn kiểm tra hint cung cấp cho chúng ta một ví dụ về plan TABLE ACCESS FULL mà chúng ta muốn sử dụng. Tại thời điểm này, chúng ta có thể sử dụng SPM để liên kết plan ưa thích của chúng ta với truy vấn ứng dụng. Đây là các bước:

Bước 0 xác nhận rằng chúng ta có một câu lệnh SQL với một plan mà chúng ta muốn thay đổi. Các bước còn lại là:

  1. Tạo SQL plan baselines bị vô hiệu hóa ban đầu cho truy vấn ứng dụng. Tôi đang sử dụng thuật ngữ “một hoặc nhiều” vì một truy vấn có thể có nhiều hơn một plan thực thi SQL. chúng ta sẽ tạo SQL plan baselines cho mỗi plan được sử dụng bởi câu lệnh SQL, nhưng chỉ một plan thực sự cần thiết.

  2. Thực thi (hoặc phân tích cú pháp) một truy vấn thử nghiệm hint để tạo plan ưa thích.

  3. Tải plan ưa thích vào SQL plan baselines được tạo ở bước hai (lần này với kích hoạt = 'YES').

SQL Text của câu lệnh hint tất nhiên khác với SQL Text ứng dụng, nhưng điều đó vẫn tốt: chúng ta chỉ đơn giản là sử dụng plan chứ không phải SQL Text. Truy vấn ứng dụng của chúng ta sẽ sử dụng plan miễn là nó có thể tái tạo và hợp lệ. Ý tôi là gì? Đây là một ví dụ:

Hãy tưởng tượng một truy vấn CUSTOMERS xảy ra để thực hiện quét FULL:

select sum(num) from CUSTOMERS;

Nếu chúng ta sử dụng plan cho truy vấn này để cố gắng tác động đến truy vấn SALES của chúng ta, thì nó sẽ không hoạt động. chúng ta sẽ yêu cầu SQL plan baselines ảnh hưởng đến plan SALES như thế này:

select /*+ FULL(customers) */ sum(num) from SALES where id < :idv

SQL plan baselines sử dụng một tập hợp FULL các hint để kiểm soát các plan thực thi. Vì vậy, đối với truy vấn SALES của chúng ta, FULL (khách hàng) không phải là hint hợp lệ và sẽ không mang lại kết quả mong muốn! Nếu bạn có một chút thời gian, bạn có thể thử tải một plan cho truy vấn CUSTOMERS vào SQL plan baselines được liên kết với truy vấn SALES. Sẽ không có thông báo lỗi, nhưng bạn sẽ không thể tạo lại plan bạn muốn (trừ khi đó là do may mắn).

Ví dụ

Tôi đã tải lên một quy trình ví dụ  và một ví dụ hoạt động FULL lên GitHub để bạn có thể thấy các bước trên có thể được triển khai như thế nào. Dựa trên một bình luận bên dưới, tôi cũng đã thêm quy trình này . Nó tải tất cả các plan hiện có ở trạng thái bị vô hiệu hóa và thêm SQL plan baselines được kích hoạt mới (thay vì thay thế một plan hiện có). Bạn nên điều chỉnh các thủ tục để đáp ứng các yêu cầu cụ thể của bạn. Ví dụ: bạn có thể không muốn bỏ qua các SQL plan baselines đã có từ trước.

Tôi sẽ sử dụng các ID SQL và giá trị băm plan mà tôi đã tô đậm ở trên. Đây là cách sử dụng các thủ tục mẫu của tôi set_my_planadd_my_plan (xem proc.sql và proc2.sql trong GitHub) :

Thực hiện các thủ tục

Lưu ý rằng “SPB” là viết tắt của SQL plan baselines:

SQL> set serveroutput on

SQL> set linesize 200

SQL> exec set_my_plan('f23qunrkxdgdt','82x4tj3z2vg23',1047182207)

No existing SQL plan baselines to drop

Created 1 disabled SPBs for SQLID f23qunrkxdgdt

SPB Detail: SQL_PLAN_3yr9p97b3j5gbfaa7aab3 handle SQL_3f5d3549d63895eb

Associating plan SQLID/PHV 82x4tj3z2vg23/1047182207 with SPB SQL Handle SQL_3f5d3549d63895eb

Enabled SPB - Name: SQL_PLAN_3yr9p97b3j5gb35032dee SQL handle: SQL_3f5d3549d63895eb

SQL> set serveroutput off

Đây là plan cho truy vấn ứng dụng sau khi thủ tục được thực thi. Câu lệnh SQL không được hint bây giờ sử dụng quét FULL và bạn có thể thấy từ phần Lưu ý rằng SQL plan baselines đang được sử dụng.

SQL> SELECT *

  2  FROM table(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'LAST'));

 

PLAN_TABLE_OUTPUT

-----------------

SQL_ID  f23qunrkxdgdt, child number 0

-------------------------------------

select sum(num) from sales where id < :idv


Plan hash value: 1047182207

------------------------------------

| Id  | Operation      | Name  |

------------------------------------

|   0 | SELECT STATEMENT   |   |

|   1 |  SORT AGGREGATE |   |

|*  2 |   TABLE ACCESS FULL| SALES |

------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

   2 - filter("ID"<:IDV)


Note

-----

   - SQL plan baseline SQL_PLAN_3yr9p97b3j5gb35032dee used for this statement

Ghi chú sử dụng

SPM khớp với một câu lệnh SQL bằng cách sử dụng chữ ký (signature), không phải là SQL ID. Chữ ký được tạo từ SQL Text chuẩn hóa. Vì lý do này, nếu có nhiều SQL ID có cùng chữ ký thì tất cả chúng sẽ chia sẻ cùng một SQL plan baselines. Ví dụ: các truy vấn sau có cùng một chữ ký:

select sum(num) from sales where id < :idv

SELECT SUM(num) FROM sales WHERE id < :idv

select      sum(num) from sales where id < :idv

Các thủ tục ví dụ (ở trên) sẽ loại bỏ bất kỳ SQL plan baselines nào đã có từ trước cho các câu lệnh SQL có cùng chữ ký với câu lệnh SQL ứng dụng. Các tập lệnh mới hơn  sẽ tạo ra lỗi nếu có các SQL plan baselines hiện có trừ khi bạn sử dụng tham số FORCE.

Hy vọng hữu ích cho bạn.


=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master