2010-07-07 33 views
6

Tôi đã có một bảng SQL với một số triệu mục và tôi đã cố truy vấn số lượng mục nhập cũ hơn 60 ngày (Oracle 11.2. 0.1.0).Tại sao truy vấn có chi phí chọn phụ ít hơn truy vấn có hằng số trong Oracle

Đối với thí nghiệm này tôi đã sử dụng 3 phiên bản khác nhau của select-tuyên bố:
(Chi phí có giá trị được đưa ra bởi cóc cho Oracle V. 9.7.2.5)

  1. select count(*) from fman_file
    where dateadded >= (select sysdate - 60 from dual)

    Chi phí: 65

  2. select count(*) from fman_file
    where dateadded >= sysdate - 60

    Chi phí: 1909

  3. select count(*) from fman_file
    where dateadded >= sysdate - numtodsinterval(60,'day')

    Chi phí: 1884

  4. select count(*) from fman_file where dateadded >= '10.10.2009'
    Chi phí: 1823
    (The 2009/10/10 chỉ là một ví dụ cập nhật !!!)

Tôi không có thời gian chính xác -giá trị cho tất cả các truy vấn trong đầu, nhưng đầu tiên thực sự là nhanh nhất. Vì vậy, tôi đã thử thêm một số truy vấn chọn lọc với các lựa chọn khác (như (Chọn 1000 từ kép)) và chúng (đôi khi WAY) nhanh hơn các giá trị khác có giá trị không đổi. Nó thậm chí có vẻ rằng điều này "WHATEVER" (Bug/Feature) đang xảy ra trong MySQL quá.

Vì vậy, bất kỳ ai cũng có thể cho tôi biết tại sao truy vấn đầu tiên nhanh hơn các truy vấn khác?

Greetz

P.S .: Đây không phải là về sydate! Câu hỏi đặt ra là TẠI SAO LÀ B VARNG CỨU VỚI (CHỌN) NHANH CHÓNG NHỮNG NGƯỜI KHÁC? (với một chút tập trung vào Chọn biến thể (1.) so với biến thể không đổi (4.))

+1

không thể cho bạn biết tại sao, nhưng nếu bạn đang cố gắng để xác định số lượng hồ sơ OLDER hơn 60 ngày, không phải là nhà điều hành quan hệ của bạn đảo ngược? – DCookie

+0

Tôi có thể tái tạo hiệu ứng này cũng trên 10.2.0.2.0, nhưng sự khác biệt nhỏ hơn nhiều: 4723 với chọn lựa, 4736 với so sánh đơn giản. –

+1

Chi phí "thấp hơn" không nhất thiết có nghĩa là "nhanh hơn". Mặc dù nó có thể có một số giá trị trong một truy vấn rất đơn giản như của bạn, thông thường bạn không thể so sánh các giá trị chi phí từ một truy vấn này với truy vấn khác. Mục đích của họ là so sánh các kế hoạch * khác nhau * cho cùng một truy vấn. –

Trả lời

0

Bạn đã thử lại các số 2-4 với() xung quanh phép tính sau> = - có vẻ như với tôi câu lệnh đầu tiên là câu lệnh duy nhất mà nó tính toán giá trị đó một lần - cho tất cả những giá trị khác mà nó tính toán lại trên mỗi hàng. ví dụ:

select count(*) from fman_file where dateadded >= (SELECT sysdate - 60) 

select count(*) from fman_file where dateadded >= (SELECT (sysdate - numtodsinterval(60,'day')) 

select count(*) from fman_file where dateadded >= (SELECT CONVERT(datetime,'10.10.2009')) 

NB - không biết cú pháp để chuyển sang giờ trong Oracle - nhưng bạn có ý tưởng.

1

Tom Kyte:

Ưu điểm đến kép là ưu hiểu khi kép là một trong những hàng đặc biệt, bảng một cột - khi bạn sử dụng nó trong các truy vấn, nó sử dụng kiến ​​thức này khi phát triển các kế hoạch .

3

Tìm thấy một số gợi ý trong bản sao của tôi về "Chi phí-Based Oracle cơ bản" của Jonathan Lewis trong chương 6 " sysdate đáng ngạc nhiên ". Điều này dường như áp dụng cho 9i, có lẽ cũng là phiên bản sau này.

Các đối xử ưu sysdate (và trunc (sysdate) và một vài chức năng khác của sysdate) như hằng số được biết đến vào thời gian phân tích cú pháp, nhưng sysdate + N trở thành một người vô danh, và được đối xử như một biến ràng buộc - đó có nghĩa là lựa chọn cố định 5%. (Lưu ý đặc biệt rằng sysdate + 0 sẽ cung cấp một cardinality khác từ sysdate.)

Dường như trình tối ưu hóa cũng nhận ra select sysdate from dual là hằng số đã biết.

0

thay vì sử dụng (chọn sysdate - 60 từ kép) tôi thà khuyên bạn nên sử dụng một biến ràng buộc, mà giá trị được tính toán trước khi truy vấn trở nên thực hiện

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