tôi đang làm một số điểm chuẩn cơ sở dữ liệu bằng Python sử dụng các mô-đun cx_Oracle. Để đánh giá kết quả, tôi đang chạy 150 truy vấn duy nhất và định thời gian thực hiện từng truy vấn. Tôi đang chạy một cái gì đó như thế này:Oracle 11g - truy vấn dường như bộ nhớ cache ngay cả với nocache gợi ý
c = connection.cursor()
starttime = time.time()
c.execute('SELECT /*+ NOCACHE */ COUNT (*) AS ROWCOUNT FROM (' + sql + ')')
endtime = time.time()
runtime = endtime - starttime
Mỗi truy vấn được thông qua năm qua biến sql
, và họ thay đổi đáng kể trong thời gian, thời gian chạy, và các bảng họ truy cập. Nói như vậy, tất cả các truy vấn hiện các hành vi sau đây:
1st run: rất chậm (tương đối)
2nd chạy: nhanh hơn đáng kể (mất bất cứ nơi nào từ 1/2 - 1/5 thời gian)
chạy thứ 3: nhẹ nhanh hơn chạy 2
Tất cả chạy tiếp theo> = 4: xấp xỉ bằng 3 chạy
tôi cần bộ nhớ cache bị vô hiệu hóa để có được kết quả chính xác, nhưng vài lần chạy đầu tiên được thực sự ném ra khỏi dữ liệu của tôi; nó như thể NOCACHE
không hoạt động chút nào ... những gì đang xảy ra ở đây?
Edit: Allan đã trả lời câu hỏi của tôi, nhưng đối với bất cứ ai có thể quan tâm, tôi đã làm một chút nghiên cứu nhiều hơn và đã xem qua hai trang này mà cũng hữu ích:
How to clear all cached items in Oracle
http://www.dba-oracle.com/t_flush_buffer_cache.htm
Bạn _want_ hệ thống sống để làm bộ nhớ đệm, bởi vì đó cải thiện hiệu suất. Vì vậy, bạn không nên sắp xếp điểm chuẩn của mình sao cho điểm chuẩn đầu tiên cho mỗi truy vấn bị loại bỏ (a.k.a. "burn-in"). Bạn có loại truy vấn nào trong 'sql'? Cách bạn đang truy cập trong truy vấn không cho phép sử dụng _bind variables_, tức là nếu các truy vấn chứa tham số đầu vào, các tham số này sẽ được nhúng vào truy vấn theo nghĩa đen, điều này sẽ gây ra [phân tích cú pháp cứng] (https: // asktom. oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2588723819082) để đặt trước mỗi lần thực hiện, mà tôi cho là gây ra độ trễ trong # 1. –
Tôi là một chút bối rối. Vì tôi đang điểm chuẩn với giả định rằng truy vấn sẽ được phân tích cú pháp trong sản xuất, tôi * muốn * để giữ cho các lần chạy chậm hơn. Trong thực tế, tôi thực sự tìm cách để làm cho tất cả chúng phù hợp với lần chạy đầu tiên.Tình trạng này yêu cầu các truy vấn không được lưu trữ, vì việc kiểm tra diễn ra trên nhiều cơ sở dữ liệu với các cấu hình khác nhau và người dùng trên hệ thống sẽ chỉ chạy truy vấn một lần, điều này làm cho thời gian lưu trữ không hợp lệ cho điểm chuẩn. – McGlothlin
OK, tôi không biết bạn đang thử nghiệm các truy vấn sẽ chỉ được chạy _once_ trong sản xuất. Nếu các truy vấn thực sự nặng, thì việc phân tích cú pháp cứng có lẽ không phải là yếu tố lớn nhất ở đây, mà thay vào đó việc thực thi truy vấn chỉ chậm. Bạn có thể sử dụng một tiện ích Oracle như tkprof cho hồ sơ? –