Trong phần trước chúng ta đã tìm hiểu về proc GATHER_TABLE_STATS. Trong phần này chúng ta sẽ tìm hiểu tiếp 1 số proc khác trong package DBMS_STATS phục vụ cho công việc gather stats.

 

Gather index stats

 

Đối tượng thường đi cùng với table là index. Ở phần trước, chúng ta đã biết khi sử dụng tham số CASCADE trong GATHER_TABLE_STATS thì Oracle sẽ gather thêm index stats nếu cần thiết (auto_cascade) hay luôn luôn gather index liên quan (true).

 

Trong trường hợp muốn gather index stats riêng, ta có thể sử dụng proc DBMS_STATS.GATHER_INDEX_STATS cũng với 2 tham số bắt buộc là ownname và indname.

 

Proc này cũng hỗ trợ các tham số khác tương tự GATHER_TABLE_STATS như partname, estimate_percent, degree, granularity, no_invalidate.

 

 

Gather schema stats, database stats

 

Ở mức cao hơn, ta có thể gather schema stats bằng DBMS_STATS.GATHER_SCHEMA_STATS hoặc toàn bộ database stats bằng DBMS_STATS.GATHER_DATABASE_STATS. Tuy nhiên lưu ý là với những schema hay database lớn, việc gather stats cũng tốn thời gian và resource. 2 procedure này cũng có các tham số tương tự như gather table stats.

 

Ngoài ra, với gather schema stats và gather database stats, ta có thêm tham số OPTIONS với các giá trị

  • GATHER: gather stats trên mọi object
  • GATHER AUTO: gather trên những object thấy cần thiết
  • GATHER STALE: gather trên những object có statistics đã cũ
  • GATHER EMPTY: gather trên những object chưa có statistics
  • LIST AUTO: trả về danh sách những object thấy cần thiết phải gather
  • LIST STALE: trả về danh sách những object có statistics đã cũ
  • LIST EMPTY: trả về danh sách những object chưa có statistics

Với gather schema stats, ta có thêm tham số GATHER_TEMP để xác định có gather stats trên các global temporary table hay không.

Với gather database stats, ta có thêm tham số GATHER_SYS để xác định có gather stats trên các object của user SYS hay không.

 

 

 

Cấu hình sẵn các tham số cho việc gather stats

 

Các tham số cấu hình như estimate_percent, degree, method_opt… có giá trị mặc định cơ bản đủ dùng. Nếu muốn thay đổi các giá trị mặc định đó trên mỗi table để khi gather ta không phải chỉ rõ, ta có thể sử dụng proc DBMS_STATS.SET_TABLE_PREFS

 

Trước đó, để kiểm tra, ta có thể dùng proc DBMS_STATS.GET_PREFS

 

 

 

Các tham số có thể set: cascade, degree, estimate_percent, method_opt, no_invalidate, granularity, publish, incremental, stale_percent

 

Để thay đổi giá trị mặc định tham số cho tất cả các table trong schema, ta sử dụng DBMS_STATS.SET_SCHEMA_PREFS (thực chất là gọi set_table_prefs trên từng table). 

 

 

Để thay đổi giá trị mặc định tham số cho tất cả các table của các user trong database, ta sử dụng DBMS_STATS.SET_DATABASE_PREFS (thực chất là gọi set_table_prefs trên từng table). 

 

Với các giá trị mặc định của hệ thống, để thay đổi, ta sử dụng DBMS_STATS.SET_GLOBAL_PREFS.

 

Như vậy, mức độ ưu tiên tham số khi gather stats sẽ lần lượt là:

Tham số trong dòng lệnh -> tham số ở table level -> tham số ở global level

 

Với hàm SET_GLOBAL_PREFS, ngoài các tham số cơ bản như trên, ta còn có thể thay đổi 2 giá trị tham số:

 

AUTOSTATS_TARGET: xác định các object nào “auto stats gather job” sẽ quan tâm

  • ALL: tất cả các object trong database
  • ORACLE: chỉ các object của hệ thống
  • AUTO (mặc định): tùy Oracle cân nhắc

 

 CONCURRENT: có cho chạy nhiều job cùng lúc để gather stats nhanh hơn không. Mặc định FALSE.

 

Gather system stats, dictionary stats, fixed objects stats

 

System statistics ban đầu dùng các giá trị mặc định do Oracle đưa ra, cơ bản phù hợp với đa số các hệ thống. Để gather system statistics, ta chỉ cần gather 1 lần vào lúc database đang hoạt động nhiều.

 

 

Statistics trên các dictionary table được cập nhật bằng “auto stats gather job” của hệ thống. Nếu muốn gather thủ công:

 

 

Các fixed objects như các table X$ không được gather stats bằng “auto stats gather job”, do đó ta cần thực hiện thủ công

 

 

Backup/restore stats

 

Mỗi table khi được cập nhật statistics, bản statistics cũ sẽ được lưu lại trong dictionary table, ta có thể query trong view DBA_TAB_STATS_HISTORY

 

Để restore lại bản statistics cũ, ta sử dụng proc DBMS_STATS.RESTORE_TABLE_STATS

 

Ta cũng có thể restore schema stats, restore database stats, restore dictionary stats… bằng các proc tương tự.

 

Export/Import stats

 

Ta có thể export schema statistics vào 1 table trên database production và import statistics vào database test để giả lập môi trường tương tự, hoặc cũng có thể dùng cách này để backup/restore statistics.

 

 

 

Ta cũng có thể export/import table stats, database stats, system stats, dictionary stats… bằng các proc tương tự.

 

Compare stats

 

Để so sánh statistics khác nhau giữa 2 thời điểm, giữa 2 stats table, giữa stats table với stats hiện tại trong dictionary, giữa pending statistics với stats table, giữa pending statistics với stats hiện tại trong dictionary… ta có thể sử dụng các function dưới đây:

  • DBMS_STATS.DIFF_TABLE_STATS_IN_STATTAB
  • DBMS_STATS.DIFF_TABLE_STATS_IN_HISTORY
  • DBMS_STATS.DIFF_TABLE_STATS_IN_PENDING

 

 

Kết quả

 

 

Lock/Unlock stats

 

Trong 1 số trường hợp, ta muốn cố định statistics trên table không cho thay đổi. Khi đó ta có thể dùng proc DBMS_STATS.LOCK_TABLE_STATS

 

Để unlock, ta dùng proc DBMS_STATS.UNLOCK_TABLE_STATS