2008-09-17 13 views
20

Theo kinh nghiệm của bạn, số liệu thống kê cơ sở dữ liệu Oracle nên chạy thường xuyên như thế nào? Nhóm 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 1/2 tháng. Nghe có vẻ như rất lâu với tôi, nhưng tôi không phải là một DBA.Số liệu thống kê cơ sở dữ liệu Oracle nên chạy thường xuyên như thế nào?

Trả lời

12

Trong công việc cuối cùng của mình, chúng tôi đã chạy 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 kế hoạch cho họ 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 lâu nhất cho bất kỳ điều gì bất ngờ. (Thứ sáu đã được chọn bởi vì nó thường chỉ sau khi phát hành mã, và có xu hướng là một ngày giao thông khá thấp.) Khi họ nhìn thấy một truy vấn xấu họ sẽ tìm thấy một kế hoạch truy vấn tốt hơn và lưu nó để nó sẽ không thay đổi một lần nữa bất ngờ . (Oracle có các công cụ để thực hiện việc này cho bạn một cách tự động, bạn cho nó biết truy vấn để tối ưu hóa và thực hiện.)

Nhiều tổ chức tránh chạy số liệu thống kê vì sợ các kế hoạch truy vấn xấu xuất hiện đột ngột. Nhưng điều này thường có nghĩa là các kế hoạch truy vấn của họ trở nên tệ hơn và tệ hơn theo thời gian.Và khi họ chạy thống kê thì họ gặp phải một số vấn đề. Sự tranh giành kết quả để khắc phục những vấn đề này khẳng định nỗi lo của họ về sự nguy hiểm của các thống kê đang chạy. 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 như chúng được cho là, và các vấn đề cố định khi chúng xuất hiện thì chúng sẽ ít đau đầu hơn và chúng sẽ không gặp phải tất cả cùng một lúc.

13

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

Nếu bảng chuyển từ 1 hàng sang 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ể đáng kể. Khi một bảng đi từ 1000 hàng tất cả với các giá trị giống hệt nhau trong cột được truy vấn thường X đến 1000 hàng với các giá trị gần như duy nhất trong cột X, đó là một thay đổi đáng kể.

Thông tin cửa hàng thống kê về số lượng mục và tần suất tương đối - những thứ sẽ cho phép "đoán" số 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 rất kế hoạch truy vấn tối ưu.

5

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

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

Nó nói:

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

2

Khi tôi quản lý hệ thống lập kế hoạch nhiều người dùng lớn được Oracle hỗ trợ, 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 triển khai 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ỳ để mọi thứ bị bắt kịp.

1

Đảm bảo cân bằng rủi ro mà thống kê mới gây ra những 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à số liệu thống kê cũ có thể khiến kế hoạch truy vấn thay đổi.

Hãy tưởng tượng bạn có cơ sở dữ liệu lỗi với bảng ISSUE và cột CREATE_DATE trong đó các giá trị trong cột tăng nhiều hay ít đơ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 thống nhất từ ​​ngày 1 tháng 1 năm 2008 đến ngày 17 tháng 9 năm 2008. Điều này làm cho người tối ưu hóa có thể ước tính hợp lý số lượng hàng được trả lại nếu bạn đang tìm kiếm tất cả các vấn đề được tạo vào tuần trước (tức là ngày 7 - 13 tháng 9). Nếu ứng dụng tiếp tục được sử dụng và các số liệu thống kê không bao giờ được cập nhật, mặc dù, biểu đồ này sẽ ít chính xác hơn. 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 vào tuần trước" trở nên ít 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.

0

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

2

Với phiên bản 10g trở lên của oracle, các thống kê cập nhật trên bảng và chỉ mục là cần thiết bởi trình tối ưu hóa để đưa ra quyết định "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 phức tạp. Nó phụ thuộc vào ứng dụng, lược đồ, tốc độ dữ liệu và thực tiễn 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ũ của oracle không hoạt động tốt với trình tối ưu hóa mới. Những ứng dụng đó yêu cầu các bảng không có số liệu thống kê sao cho db resort trở lại kế hoạch thực thi cơ sở quy tắc. Nhưng trên oracle trung bình khuyến cáo rằng số liệu thống kê được thu thập trên bảng với số liệu thống kê cũ. Bạn có thể thiết lập 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 nó không phải là. 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 chúng tôi, chúng tôi có một bộ 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 thiết vì các bảng quá lớn để phân tích thường xuyên mà không ảnh hưởng đến tải và hiệu suất tổng thể của db. Vì vậy, câu trả lời đúng là, nó phụ thuộc vào ứng dụng, thay đổi dữ liệu và nhu cầu kinh doanh.

11

Do số liệu thống kê 11g của Oracle được tập hợp tự động theo mặc định.

Hai cửa sổ Scheduler được xác định trước khi cài đặt Oracle Database:

  • WEEKNIGHT_WINDOW bắt đầu lúc 22:00 và kết thúc lúc 6 giờ sáng mỗi Thứ Hai đến thứ Sáu.
  • TUẦNEND_WINDOW bao gồm cả ngày thứ Bảy và Chủ Nhật.

Khi 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 biểu cửa sổ?

SELECT window_name, start_time, duration FROM dba_autotask_schedule; 

thủ thu thập cơ sở dữ liệu thống kê trong Schema này:

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

thủ thu thập cơ sở dữ liệu thống kê trong tất cả các Schemas!

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

Nói chung nó không được khuyến khích để thu thập thống kê nên thường xuyên trên toàn bộ cơ sở dữ liệu, trừ khi bạn có một sự biện minh mạnh mẽ cho rằng, chẳng hạn như một số lượng lớn chèn 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 thống kê về cơ sở dữ liệu trong tần suất này CÓ THỂ thay đổi kế hoạch thực hiện truy vấn thành kế hoạch thực hiện kém mới, điều này có thể khiến bạn phải mất nhiều thời gian để điều chỉnh mọi truy vấn bị ảnh hưởng bởi kế hoạch nghèo mới, đây là lý do tại sao bạn nên kiểm tra tác động của thu thập số liệu thống kê mới trên cơ sở dữ liệu thử nghiệm hoặc trong trường hợp bạn không có thời gian hoặc sức mạnh của con người, í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 thu thập dữ liệu mới. một thống kê mới và sau đó các truy vấn không hoạt động như mong đợi, bạn có thể dễ dàng khôi phục lại các thống kê ban đầu.

Có một kịch bản rất hữu ích có thể giúp bạn sao lưu số liệu thống kê ban đầu và thu thập lệnh 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 các thống kê ban đầu trong trường hợp điều đó không diễn ra 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-statistics-on.html