Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Thu thập số liệu thống kê về một Chỉ mục hoặc thả tạo?

Sự khác biệt là, việc thu thập số liệu thống kê sẽ làm mới siêu dữ liệu về chỉ mục hiện tại trong khi việc giảm và tạo lại chỉ mục là, er, giảm và tạo lại chỉ mục.

Có lẽ rất dễ hiểu sự khác biệt với một ví dụ đã làm việc. Vì vậy, hãy tạo một bảng và một chỉ mục:

SQL> create table t23 
  2  as select object_id as id, object_name as name from user_objects 
  3  /

Table created.

SQL> create index i23 on t23(id)
  2  /

Index created.

SQL> select o.object_id, i.last_analyzed, i.distinct_keys
  2  from user_objects o
  3       join user_indexes i
  4            on (i.index_name = o.object_name)
  5  where o.object_type = 'INDEX'
  6  and i.index_name = 'I23'
  7  /

 OBJECT_ID CREATED              LAST_ANALYZED        DISTINCT_KEYS
---------- -------------------- -------------------- -------------
    116353 23-NOV-2013 00:15:39 23-NOV-2013 00:15:39           167

1 row selected.

SQL> 

Kể từ 11g Oracle tự động thu thập số liệu thống kê khi chúng ta tạo chỉ mục. Vì vậy, việc tạo chỉ mục và phân tích cuối cùng hiển thị cùng một ngày giờ. Trong các phiên bản trước, chúng tôi phải thu thập số liệu thống kê một cách rõ ràng sau khi chúng tôi tạo chỉ mục. Tìm hiểu thêm .

Tiếp theo, chúng tôi sẽ thêm một số dữ liệu và làm mới thống kê:

SQL> insert into t23 values (9999, 'TEST1')
  2  /

1 row created.

SQL> insert into t23 values (-8888, 'TEST 2')
  2  /

1 row created.

SQL> exec dbms_stats.gather_index_stats(user, 'I23') 

PL/SQL procedure successfully completed.

SQL> select o.object_id, i.last_analyzed, i.distinct_keys
  2  from user_objects o
  3       join user_indexes i
  4            on (i.index_name = o.object_name)
  5  where o.object_type = 'INDEX'
  6  and i.index_name = 'I23'
  7  /

 OBJECT_ID CREATED              LAST_ANALYZED        DISTINCT_KEYS
---------- -------------------- -------------------- -------------
    116353 23-NOV-2013 00:15:39 23-NOV-2013 00:26:28           169

1 row selected.

SQL> 

Bây giờ siêu dữ liệu liên quan đến thống kê đã thay đổi nhưng chỉ mục là cùng một đối tượng cơ sở dữ liệu. Trong khi nếu chúng ta thả và tạo lại chỉ mục, chúng ta sẽ nhận được một đối tượng cơ sở dữ liệu mới:

SQL> drop index i23
  2  /

Index dropped.

SQL> create index i23 on t23(id) 
  2  /

Index created.

SQL> select o.object_id, i.last_analyzed, i.distinct_keys
  2  from user_objects o
  3       join user_indexes i
  4            on (i.index_name = o.object_name)
  5  where o.object_type = 'INDEX'
  6  and i.index_name = 'I23'
  7  /

 OBJECT_ID CREATED              LAST_ANALYZED        DISTINCT_KEYS
---------- -------------------- -------------------- -------------
    116354 23-NOV-2013 00:27:50 23-NOV-2013 00:27:50           169

1 row selected.

SQL> 

Trong các hoạt động bình thường, chúng tôi hầu như không bao giờ cần phải giảm và tạo lại một chỉ mục. Đây là một kỹ thuật đôi khi thích hợp khi tải một lượng rất lớn dữ liệu và trong những trường hợp rất hiếm khi xảy ra lỗi chỉ mục. Các interwebs vẫn tung ra các trang web khuyến nghị thường xuyên xây dựng lại các chỉ mục vì lý do hiệu suất (được cho là nó "cân bằng lại" các chỉ mục bị lệch) nhưng các trang web này không tạo ra các điểm chuẩn để chứng minh lợi ích lâu dài và chắc chắn không bao giờ bao gồm thời gian và Chu kỳ CPU bị lãng phí bởi bài tập xây dựng lại.

Việc xây dựng lại một chỉ số đòi hỏi nhiều công việc hơn là làm mới các chỉ số. Rõ ràng là đúng, bởi vì việc xây dựng lại bao gồm việc thu thập các chỉ số như một nhiệm vụ phụ. Câu hỏi đặt ra là liệu có hiệu quả hơn nếu thực hiện DML hàng loạt dựa trên một bảng có các chỉ mục của nó so với việc loại bỏ các chỉ mục và tạo lại sau đó. Có thể nhanh hơn để tải dữ liệu vào một bảng không có chỉ mục và tạo lại chúng sau đó.

Không có quy tắc khó và nhanh ở đây:nó phụ thuộc vào số lượng chỉ mục bạn có, tỷ lệ của các hàng bị ảnh hưởng so với toàn bộ kích thước của bảng, liệu bạn có cần các chỉ mục để thực thi các ràng buộc toàn vẹn quan hệ hay không, v.v. Cũng có một sự khác biệt lớn giữa các hoạt động:bạn có thể muốn giảm chỉ mục cho chèn hàng loạt nhưng giữ lại chúng để cập nhật, tùy thuộc vào chỉ mục bạn cần cho mệnh đề WHERE của mình và liệu bản cập nhật có ảnh hưởng đến các cột được lập chỉ mục hay không.

Tóm lại, bạn cần phải chuẩn hóa kịch bản cụ thể của riêng mình. Đây thường là câu trả lời khi nói đến các câu hỏi về hiệu suất.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trong Oracle SQL:Làm cách nào để bạn chèn ngày + giờ hiện tại vào bảng?

  2. Zero Data Loss Appliance Recovery Appliance

  3. Thứ tự thực thi các điều kiện trong mệnh đề SQL 'where'

  4. asp.net core Oracle.DataAccess System.BadImageFormatException:Không thể tải tệp hoặc lắp ráp Oracle.DataAccess

  5. Các khóa chính và chỉ mục trong ngôn ngữ truy vấn Hive có khả dụng hay không?