Quản lý thống kê của Oracle Optimizer là một phần quan trọng trong việc đảm bảo hiệu suất tối ưu của cơ sở dữ liệu. Thống kê dữ liệu giúp Oracle Optimizer đưa ra các quyết định chính xác về cách thức thực hiện các câu lệnh SQL. Dưới đây là các bước và thực hành tốt nhất để quản lý thống kê Optimizer:
Managing Optimizer Statistics Oracle Database | Cập nhật thống kê Statistics trong Oracle Database
1. Thu thập thống kê (Gathering Statistics)
Thu thập thống kê cho một bảng
Sử dụng gói DBMS_STATS để thu thập thống kê cho một bảng cụ thể:
BEGIN DBMS_STATS.GATHER_TABLE_STATS( ownname => 'DUONGUSER', tabname => 'TAB1', cascade => TRUE ); END; /
- ownname: Tên của schema chứa bảng.
- tabname: Tên của bảng.
- cascade: Nếu là TRUE, thu thập thống kê cho cả các chỉ mục liên quan.
Thu thập thống kê cho toàn bộ schema
Thu thập thống kê cho tất cả các bảng trong một schema:
BEGIN DBMS_STATS.GATHER_SCHEMA_STATS( ownname => 'DUONGUSER', cascade => TRUE ); END; /
Thu thập thống kê cho toàn bộ cơ sở dữ liệu
BEGIN DBMS_STATS.GATHER_DATABASE_STATS(cascade => TRUE); END; /
2. Lập lịch thu thập thống kê tự động
Oracle có một công cụ tự động để thu thập thống kê được gọi là Auto Task. Nó thường được lập lịch chạy vào thời gian ít sử dụng tài nguyên (thường là vào ban đêm).
Kiểm tra trạng thái Auto Task
SELECT client_name, status FROM dba_autotask_client;
Kiểm tra lịch trình auto task:
SELECT * FROM dba_scheduler_windows;
Bật hoặc tắt Auto Task
BEGIN DBMS_AUTO_TASK_ADMIN.ENABLE( client_name => 'auto optimizer stats collection', operation => NULL, window_name => NULL ); END; /
Tắt Auto Task:
BEGIN DBMS_AUTO_TASK_ADMIN.DISABLE( client_name => 'auto optimizer stats collection', operation => NULL, window_name => NULL ); END; /
3. Kiểm tra và xóa thống kê
Kiểm tra thống kê hiện tại
Bạn có thể kiểm tra thời gian cuối cùng thống kê được thu thập cho một bảng:
SELECT table_name, last_analyzed FROM dba_tab_statistics WHERE owner = 'SCHEMA_NAME';
Xóa thống kê
Xóa thống kê cho một bảng:
BEGIN DBMS_STATS.DELETE_TABLE_STATS( ownname => 'SCHEMA_NAME', tabname => 'TABLE_NAME' ); END; /
Xóa thống kê cho toàn bộ schema:
BEGIN DBMS_STATS.DELETE_SCHEMA_STATS( ownname => 'SCHEMA_NAME' ); END; /
4. Thu thập thống kê tạm thời (Dynamic Sampling)
Dynamic Sampling có thể được sử dụng khi các thống kê không có sẵn hoặc không chính xác. Dynamic Sampling cho phép Optimizer thu thập thống kê tạm thời khi thực thi câu lệnh SQL.
Bạn có thể bật Dynamic Sampling cho một phiên làm việc bằng cách sử dụng hint DYNAMIC_SAMPLING:
SELECT /*+ DYNAMIC_SAMPLING(2) */ * FROM emp WHERE dept_id = 10;
Quản lý thống kê hiệu quả giúp Oracle Optimizer hoạt động tốt nhất, đảm bảo hiệu suất truy vấn tối ưu và khả năng mở rộng của cơ sở dữ liệu.