it-swarm-vi.tech

Làm thế nào thường xuyên nên thống kê cơ sở dữ liệu Oracle?

Theo kinh nghiệm của bạn, tần suất cơ sở dữ liệu Oracle nên được chạy như thế nào? Nhóm các nhà phát triển của chúng tôi gần đây đã phát hiện ra rằng số liệu thống kê đã không chạy hộp sản xuất của chúng tôi trong hơn 2 tháng rưỡi. Nghe có vẻ lâu đối với tôi, nhưng tôi không phải là một DBA.

21
user290

Ở công việc cuối cùng của chúng tôi, chúng tôi đã chạy số liệu thống kê mỗi tuần một lần. Nếu tôi nhớ chính xác, chúng tôi đã lên lịch cho chúng vào tối thứ Năm và vào thứ Sáu, các DBA đã rất cẩn thận để theo dõi các truy vấn chạy dài nhất cho bất kỳ điều gì bất ngờ. (Thứ sáu đã được chọn vì nó thường chỉ sau khi phát hành mã và có xu hướng là một ngày lưu lượng truy cập khá thấp.) . (Oracle có các công cụ để tự động làm điều này cho bạn, bạn nói với nó truy vấn để tối ưu hóa và nó thực hiện.)

Nhiều tổ chức tránh chạy các số liệu thống kê vì sợ các kế hoạch truy vấn xấu xuất hiện bất ngờ. Nhưng điều này thường có nghĩa là kế hoạch truy vấn của họ ngày càng tệ hơn theo thời gian. Và khi họ chạy số liệu thống kê thì họ gặp phải một số vấn đề. Cuộc tranh giành kết quả để khắc phục những vấn đề đó xác nhận nỗi sợ hãi của họ về sự nguy hiểm của việc chạy số liệu thống kê. Nhưng nếu họ chạy số liệu thống kê thường xuyên, sử dụng các công cụ giám sát theo đúng nghĩa vụ và khắc phục các sự cố khi chúng xuất hiện thì chúng sẽ bớt đau đầu hơn và chúng sẽ không gặp phải tất cả chúng cùng một lúc.

13
user11318

Bất cứ khi nào dữ liệu thay đổi "đáng kể".

Nếu một bảng đi từ 1 hàng đến 200 hàng, đó là một thay đổi đáng kể. Khi một bảng đi từ 100.000 hàng đến 150.000 hàng, đó không phải là một thay đổi đáng kể. Khi một bảng đi từ 1000 hàng tất cả có giá trị giống hệt nhau trong cột X được truy vấn thường đến 1000 hàng có giá trị gần như duy nhất trong cột X, đó là một thay đổi đáng kể.

Thống kê lưu trữ thông tin về số lượng vật phẩm và tần số tương đối - những thứ sẽ cho phép nó "đoán" số lượng hàng sẽ khớp với một tiêu chí nhất định. Khi nó đoán sai, trình tối ưu hóa có thể chọn một rất kế hoạch truy vấn tối ưu.

13
Jonathan Rupp

Vì thống kê Oracle 11g được thu thập tự động theo mặc định.

Hai cửa sổ Trình lập lịch biểu được xác định trước khi cài đặt Cơ sở dữ liệu Oracle:

  • WEEKNIGHT_WINDOW bắt đầu lúc 10 giờ và kết thúc lúc 6 giờ sáng thứ Hai hàng tuần .__ đến thứ Sáu. 
  • TUẦN_WINDOW bao gồm cả ngày thứ bảy và chủ nhật.

Khi số liệu thống kê được thu thập lần cuối?

SELECT owner, table_name, last_analyzed FROM all_tables ORDER BY last_analyzed DESC NULLS LAST; --Tables.
SELECT owner, index_name, last_analyzed FROM all_indexes ORDER BY last_analyzed DESC NULLS LAST; -- Indexes.

Tình trạng thu thập số liệu thống kê tự động?

SELECT * FROM dba_autotask_client WHERE client_name = 'auto optimizer stats collection';

Nhóm Windows?

SELECT window_group_name, window_name FROM dba_scheduler_wingroup_members;

Lịch trình cửa sổ?

SELECT window_name, start_time, duration FROM dba_autotask_schedule;

Thu thập thủ công Thống kê cơ sở dữ liệu trong Lược đồ này: 

EXEC dbms_stats.gather_schema_stats(ownname=>NULL, cascade=>TRUE); -- cascade=>TRUE means include Table Indexes too.

Thu thập thủ công Thống kê cơ sở dữ liệu trong tất cả các lược đồ!

-- Probably need to CONNECT / AS SYSDBA
EXEC dbms_stats.gather_database_stats;
13
grokster

Phiên bản Oracle nào bạn đang sử dụng? Kiểm tra trang này đề cập đến Oracle 10:

http://www.acs. whileu.edu/docs/Oracle/server.101/b10752/stats.htm

Nó nói rằng:

Cách tiếp cận được đề xuất để thu thập số liệu thống kê là cho phép Oracle tự động thu thập số liệu thống kê. Oracle thu thập số liệu thống kê trên tất cả các đối tượng cơ sở dữ liệu tự động và duy trì các số liệu thống kê đó trong một công việc bảo trì được lên lịch thường xuyên.

5
David Medinets

Với phiên bản 10g và cao hơn của Oracle, trình tối ưu hóa cập nhật trên các bảng và chỉ mục là cần thiết cho trình tối ưu hóa để đưa ra quyết định kế hoạch thực hiện "tốt". Tần suất bạn thu thập số liệu thống kê là một cuộc gọi khó khăn. Nó phụ thuộc vào ứng dụng, lược đồ, tốc độ dữ liệu và thực hành kinh doanh của bạn. Một số ứng dụng của bên thứ ba được viết tương thích ngược với phiên bản cũ hơn của Oracle không hoạt động tốt với trình tối ưu hóa mới. Các ứng dụng đó yêu cầu các bảng không có số liệu thống kê để db sử dụng lại quy tắc thực thi cơ sở. Nhưng trên trung bình, Oracle khuyến nghị rằng các số liệu thống kê được thu thập trên các bảng có số liệu thống kê cũ. Bạn có thể đặt các bảng để theo dõi và kiểm tra trạng thái của chúng và yêu cầu chúng phân tích nếu/khi cũ. Thường thì đó là đủ, đôi khi không. Nó thực sự phụ thuộc vào cơ sở dữ liệu của bạn. Đối với cơ sở dữ liệu của tôi, chúng tôi có một tập hợp các bảng OLTP cần thu thập số liệu thống kê hàng đêm để duy trì hiệu suất. Các bảng khác được phân tích mỗi tuần một lần. Trên cơ sở dữ liệu dw lớn của chúng tôi, chúng tôi phân tích khi cần vì các bảng quá lớn để phân tích thường xuyên mà không ảnh hưởng đến hiệu suất và tải db tổng thể. Vì vậy, câu trả lời chính xác là, nó phụ thuộc vào ứng dụng, thay đổi dữ liệu và nhu cầu kinh doanh.

2
MichaelN

Khi tôi đang quản lý một hệ thống lập kế hoạch nhiều người dùng lớn được hỗ trợ bởi Oracle, DBA của chúng tôi có một công việc hàng tuần thu thập số liệu thống kê. Ngoài ra, khi chúng tôi đưa ra một thay đổi đáng kể có thể ảnh hưởng hoặc bị ảnh hưởng bởi số liệu thống kê, chúng tôi sẽ buộc công việc phải hết chu kỳ để bắt kịp mọi thứ.

2
Joe Skora

Đảm bảo cân bằng rủi ro rằng các số liệu thống kê mới gây ra các thay đổi không mong muốn đối với các kế hoạch truy vấn chống lại rủi ro mà các thống kê cũ có thể khiến các kế hoạch truy vấn thay đổi. 

Hãy tưởng tượng bạn có một cơ sở dữ liệu lỗi với bảng ISSUE và một cột CREATE_DATE trong đó các giá trị trong cột tăng ít nhiều đơn điệu. Bây giờ, giả sử rằng có một biểu đồ trên cột này cho Oracle biết rằng các giá trị cho cột này được phân phối đồng đều trong khoảng thời gian từ ngày 1 tháng 1 năm 2008 đến ngày 17 tháng 9 năm 2008. Điều này giúp trình tối ưu hóa có thể ước tính hợp lý số lượng hàng sẽ được trả lại nếu bạn đang tìm kiếm tất cả các vấn đề được tạo ra vào tuần trước (tức là ngày 7 - 13 tháng 9). Tuy nhiên, nếu ứng dụng tiếp tục được sử dụng và số liệu thống kê không bao giờ được cập nhật, biểu đồ này sẽ ngày càng kém chính xác. Vì vậy, trình tối ưu hóa sẽ mong đợi các truy vấn cho "các vấn đề được tạo ra vào tuần trước" sẽ ngày càng kém chính xác hơn theo thời gian và cuối cùng có thể khiến Oracle thay đổi kế hoạch truy vấn một cách tiêu cực. 

1
Justin Cave

Nói chung, không nên thu thập số liệu thống kê thường xuyên trên toàn bộ cơ sở dữ liệu trừ khi bạn có lý do chính đáng cho việc đó, chẳng hạn như chèn hàng loạt hoặc thay đổi dữ liệu lớn xảy ra thường xuyên trên cơ sở dữ liệu . Thu thập số liệu trên cơ sở dữ liệu theo tần suất này CÓ THỂ thay đổi kế hoạch thực hiện truy vấn cho một kế hoạch thực hiện kém mới, điều này có thể khiến bạn mất nhiều thời gian cố gắng điều chỉnh mọi truy vấn bị ảnh hưởng bởi các kế hoạch kém mới, đây là lý do tại sao bạn nên kiểm tra tác động của việc thu thập số liệu thống kê mới trên cơ sở dữ liệu kiểm tra hoặc trong trường hợp bạn không có thời gian hay sức mạnh cho việc đó, ít nhất bạn nên giữ một kế hoạch dự phòng bằng cách sao lưu các thống kê ban đầu trước khi bạn thu thập các thống kê mới, vì vậy trong trường hợp bạn thu thập số liệu thống kê mới và sau đó các truy vấn không thực hiện như mong đợi, bạn có thể dễ dàng khôi phục lại số liệu thống kê ban đầu.

Có một tập lệnh rất hữu ích có thể giúp bạn sao lưu số liệu thống kê gốc và thu thập số liệu mới và cung cấp cho bạn lệnh SQL mà bạn có thể sử dụng để khôi phục lại số liệu thống kê ban đầu trong trường hợp điều đó không như mong đợi sau khi thu thập số liệu thống kê mới. Bạn có thể tìm thấy tập lệnh trong liên kết này: http://dba-tips.blogspot.com/2014/09/script-to-ease-gathering-statistic-on.html

0
Chion

Trong trường hợp hệ thống kiểu kho dữ liệu, bạn có thể xem xét việc không thu thập số liệu thống kê nào và dựa vào lấy mẫu động (đặt tối ưu hóa_dynamic_sampling lên cấp 2 trở lên).

0
David Aldridge