Cách đây 11 ngày, tôi đã viết blog về việc Số liệu thống kê động thích ứng tiêu thụ tài nguyên như thế nào trong cơ sở dữ liệu RAC sản xuất của tôi.
Sau khi dập tắt ngọn lửa đó, tôi đã tiếp tục kiểm tra một số truy vấn hoạt động kém được nhân viên QA của chúng tôi báo cáo trong Cơ sở dữ liệu thử nghiệm và phi sản xuất khác. Tôi đã làm như bất kỳ Oracle DBA tốt nào sẽ làm. Tôi đã thu thập một lệnh gọi thủ tục được lưu trữ sao chép sự cố. Trong phiên của tôi, tôi bắt đầu theo dõi SQL và chạy thủ tục được lưu trữ. Phải mất 50 giây để hoàn thành, trước đây phải mất 5 giây hoặc ít hơn trước khi tôi nâng cấp từ 11.2.0.4 lên 12.1.0.2. Thủ tục được lưu trữ này chứa một số câu lệnh SQL và một dấu vết SQL dường như là một nơi hợp lý để bắt đầu. Tôi cần biết câu lệnh SQL nào trong quy trình đang gây ra sự cố.
Tôi đã chạy tệp theo dõi SQL thông qua TKPROF và rất ngạc nhiên trước kết quả. Các câu lệnh SQL trong thủ tục được lưu trữ dường như đang thực thi khá nhanh. Nhưng tôi đã được chào đón bằng nhiều câu tương tự như sau:
SELECT /* DS_SVC */ /*+ dynamic_sampling(0) no_sql_tune no_monitoring optimizer_features_enable(default) no_parallel */ SUM(C1) FROM (SELECT /*+ qb_name("innerQuery") INDEX_FFS( "XXX" "INDEX_NAME") */ 1 AS C1 FROM "OWNER"."TABLE_NAME" SAMPLE BLOCK(71.048, 8) SEED(1) "XXX") innerQuery
Đây là Lấy mẫu động tại nơi làm việc. Khi xem xét tất cả các câu lệnh Lấy mẫu động đang được thực thi trong tệp theo dõi của tôi, tôi có thể xác định rằng các câu lệnh này chiếm 45 giây của thời gian chạy tổng thể! Rất tiếc!
Lấy mẫu động được cho là sẽ giúp tôi. Thời gian dành cho việc thu thập một số thống kê mẫu được cho là nhỏ hơn nhiều so với lượng thời gian tiết kiệm được bằng cách thực thi câu lệnh SQL với số liệu thống kê tốt hơn. Nếu không, hiệu suất câu lệnh SQL của bạn có thể bị ảnh hưởng, như trường hợp của tôi.
Tôi lưu ý một điều mà tôi nghĩ là thú vị là các truy vấn Lấy mẫu động này được thực thi một lần cho mỗi bảng và một lần cho mỗi chỉ mục của nó. Một trong các bảng liên quan đến truy vấn của tôi có 7 chỉ mục trên đó, vì vậy đối với một bảng đó, tôi có 8 truy vấn Lấy mẫu động!
Trong bài đăng trên blog của tôi 11 ngày trước, tôi đã đặt tham số Optimizer_dynamic_sampling thành 0, điều này sẽ ngăn không cho các truy vấn này được thực thi. Tôi vẫn chưa đưa thay đổi đó vào môi trường Thử nghiệm của chúng tôi nên tôi cần phải làm như vậy. Ngay sau khi tôi thực hiện, hiệu suất truy vấn trở lại bình thường. Giá trị mặc định của tham số này cho cơ sở dữ liệu của tôi là 2. Giá trị mặc định của bạn có thể khác nhau tùy thuộc vào giá trị của cài đặt Optimizer_features_enable. Theo bài đăng trên blog này, giá trị bằng 2 có nghĩa là lấy mẫu động sẽ bắt đầu khi ít nhất một trong các bảng không có thống kê. Nhưng thành thật mà nói, lấy mẫu động không mang lại cho tôi bất kỳ lợi ích nào và chỉ gây hại cho tôi. Vì vậy, bây giờ tôi sẽ tạm dừng nó lại toàn bộ.