2015-10-30 18 views
6

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

+2

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. –

+0

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

+0

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ơ? –

Trả lời

6

Từ số documentation:

Gợi ý NOCACHE chỉ định rằng các khối được truy xuất cho bảng là đặt ở cuối sử dụng gần đây nhất của danh sách LRU trong bộ nhớ cache đệm khi một bảng đầy đủ quét được thực hiện. Đây là hành vi bình thường của khối trong bộ nhớ cache đệm.

Dường như điều này khiến gợi ý nocache đơn giản là không làm những gì bạn mong đợi.

Bạn có thể xóa bộ nhớ cache dùng chung bằng cách chạy ALTER SYSTEM FLUSH SHARED_POOL và bộ nhớ cache đệm bằng cách chạy ALTER SYSTEM FLUSH BUFFER_CACHE. Bạn sẽ cần phải làm điều này giữa mỗi truy vấn để ngăn bộ nhớ cache không được sử dụng.

Các vấn đề liên quan