Để tối ưu hóa câu lệnh SQL bằng SQL Tuning Advisor trong Oracle, bạn có thể thực hiện theo các bước sau đây:
1. Kết nối tới Oracle Database
Trước tiên, kết nối đến cơ sở dữ liệu Oracle của bạn bằng SQL*Plus hoặc một công cụ quản lý cơ sở dữ liệu khác như Oracle SQL Developer.
2. Tạo Task cho SQL Tuning Advisor
Bạn cần tạo một task cho SQL Tuning Advisor bằng cách sử dụng gói DBMS_SQLTUNE. Task này sẽ chứa thông tin về câu lệnh SQL bạn muốn tối ưu hóa.
Ví dụ sử dụng SQL*Plus:
BEGIN
DBMS_SQLTUNE.CREATE_TUNING_TASK (
sql_id => ‘your_sql_id’,
scope => DBMS_SQLTUNE.SCOPE_COMPREHENSIVE,
time_limit => 60,
task_name => ‘your_task_name’,
description => ‘Tuning task for a specific SQL statement’
);
END;
/
3. Thực hiện Task của SQL Tuning Advisor
Chạy task vừa tạo để SQL Tuning Advisor thực hiện phân tích và đề xuất tối ưu hóa.
BEGIN
DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name => ‘your_task_name’);
END;
/
4. Xem báo cáo từ SQL Tuning Advisor
Sau khi task hoàn tất, bạn có thể xem báo cáo từ SQL Tuning Advisor để biết các đề xuất tối ưu hóa.
SET LONG 10000;
SET PAGESIZE 1000;
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK(‘your_task_name’) AS report FROM DUAL;
5. Áp dụng đề xuất tối ưu hóa (tuỳ chọn)
Nếu SQL Tuning Advisor đưa ra các đề xuất như tạo các chỉ mục mới hoặc sử dụng các kế hoạch thực thi khác, bạn có thể chọn áp dụng các đề xuất này. Bạn cần xem xét cẩn thận các đề xuất và đảm bảo rằng chúng phù hợp với hệ thống của bạn.
BEGIN
DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
task_name => ‘your_task_name’,
name => ‘your_sql_profile_name’
);
END;
/
6. Xoá Task sau khi hoàn tất (tuỳ chọn)
Sau khi đã thực hiện và áp dụng các tối ưu hóa, bạn có thể xoá task để giải phóng tài nguyên.
BEGIN
DBMS_SQLTUNE.DROP_TUNING_TASK(task_name => ‘your_task_name’);
END;
/
Ví dụ cụ thể
Giả sử bạn có câu lệnh SQL với SQL ID là ‘8abc123xyz’ mà bạn muốn tối ưu hóa. Các bước sẽ như sau:
— Tạo task
BEGIN
DBMS_SQLTUNE.CREATE_TUNING_TASK (
sql_id => ‘8abc123xyz’,
scope => DBMS_SQLTUNE.SCOPE_COMPREHENSIVE,
time_limit => 60,
task_name => ‘tune_sql_8abc123xyz’,
description => ‘Tuning task for SQL ID 8abc123xyz’
);
END;
/
— Thực hiện task
BEGIN
DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name => ‘tune_sql_8abc123xyz’);
END;
/
— Xem báo cáo
SET LONG 10000;
SET PAGESIZE 1000;
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK(‘tune_sql_8abc123xyz’) AS report FROM DUAL;
— Áp dụng đề xuất (nếu có)
BEGIN
DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
task_name => ‘tune_sql_8abc123xyz’,
name => ‘sql_profile_8abc123xyz’
);
END;
/
— Xoá task (tuỳ chọn)
BEGIN
DBMS_SQLTUNE.DROP_TUNING_TASK(task_name => ‘tune_sql_8abc123xyz’);
END;
/