2011-01-26 38 views
26

Có sự khác biệt về hiệu suất giữa việc sử dụng mệnh đề BETWEEN hay sử dụng < = AND> = so sánh không?mệnh đề BETWEEN so với <= AND > =

ví dụ: hai truy vấn sau đây:

SELECT * 
    FROM table 
WHERE year BETWEEN '2005' AND '2010'; 

... và

SELECT * 
    FROM table 
WHERE year >= '2005' AND year <= '2010'; 

Trong ví dụ này, cột năm là VARCHAR2 (4) với một chỉ mục trên nó.

+4

Tôi sẽ không sử dụng chuỗi như ''2005'' để lọc năm hoặc ngày. –

Trả lời

16

Không có sự khác biệt về hiệu suất giữa hai truy vấn ví dụ vì BETWEEN chỉ đơn giản là cách viết tắt thể hiện một so sánh phạm vi bao gồm. Khi Oracle phân tích cú pháp điều kiện BETWEEN, nó sẽ tự động mở rộng ra thành các mệnh đề so sánh riêng biệt:

ví dụ:

SELECT * 
    FROM table 
WHERE column BETWEEN :lower_bound AND :upper_bound 

... sẽ tự động trở thành:

SELECT * 
    FROM table 
WHERE :lower_bound <= column 
    AND :upper_bound >= column 
+10

@rsenna: Không, tôi đăng câu hỏi này để lưu trữ các thông tin ở đây vì có người trong văn phòng của chúng tôi hỏi tôi điều này và tôi nhận thấy khi tìm kiếm mà không ai khác đã từng hỏi nó ở đây trước. Đó là đóng góp kiến ​​thức của tôi cho thế giới trong ngày và là việc sử dụng dịch vụ hợp lệ theo Câu hỏi thường gặp và tuyên bố nhiệm vụ. Tôi dự định hỏi, trả lời và chấp nhận câu trả lời của tôi trong vòng 10 giây nhưng hệ thống sẽ không cho phép tôi chấp nhận câu trả lời của chính mình quá nhanh để những người khác cũng bắt đầu trả lời ... – wweicker

+1

Xin chào, không sao cả. Trong thực tế SO chính thức [phê duyệt] (http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions) hành vi như vậy ... – rsenna

+0

@rsenna: Chính xác! :) Cảm ơn bạn đã đào tạo liên kết đó và để giải thích thêm về kịch bản mà tôi đã quên rằng bạn phải [đợi hai ngày để trả lời câu hỏi của riêng bạn] (http://blog.stackoverflow.com/2009/01/accept-your -own-câu trả lời /) ... – wweicker

22

Không có sự khác biệt.

Lưu ý rằng BETWEEN luôn bao gồm và nhạy cảm với thứ tự của đối số.

BETWEEN '2010' AND '2005' sẽ không bao giờ là TRUE.

+1

Phụ thuộc vào hệ thống RDBMS cơ bản. SQL-92 nói rằng _ "X GIỮA Y VÀ Z" là tương đương với "X> = Y VÀ X <= Z" _ nhưng không phải tất cả các nhà cung cấp đều nhả vào dòng đó. SQL Server, ví dụ, không. –

+0

@Nicholas: hãy xem các thẻ câu hỏi. Đối với bạn 'SQL Server' bình luận, bạn có thể vui lòng cung cấp một tài liệu tham khảo? – Quassnoi

+0

Trừ khi họ đã thắt chặt mọi thứ cho đến giữa, trật tự là không quan trọng. Không thể nói rằng tôi đã thử nghiệm mà gần đây, mặc dù. Đã bị đốt cháy trước đó, Nếu thứ tự là quan trọng đối với một thử nghiệm, tôi thực hiện kiểm thử rõ ràng với '> =' và '<='. –

5

Thực ra nó phụ thuộc vào công cụ DBMS của bạn.

Một số hệ thống quản lý cơ sở dữ liệu sẽ tính hai lần biểu thức của bạn (một lần cho mỗi lần so sánh) và chỉ một lần khi bạn sử dụng BETWEEN.

Trên thực tế nếu các biểu thức có thể có một kết quả không xác định BETWEEN sẽ có một hành vi khác nhau, so sánh sau đây trong SQLite:

WHERE RANDOM() BETWEEN x AND y -- one random value generated 

WHERE RANDOM() >= x AND RANDOM() <= y -- two distinct random values generated 

này có thể rất tốn thời gian nếu biểu hiện của bạn là (ví dụ) một truy vấn phụ.

+0

Tư tưởng thú vị ... Bạn có thể cung cấp một ví dụ cho điều này không? Bạn đã trải nghiệm cơ sở dữ liệu nào? –

+0

@LukasEder: xem ví dụ – Benoit

+0

Hmm, suy nghĩ tốt. Điều đó để lại một số câu hỏi mở về [SQL standard] (http://stackoverflow.com/a/9680753/521799), và liệu nó có thực sự có thể cho rằng hai biểu thức tương đương với –

2

Khi nghi ngờ (đối với Oracle anyway), hãy chạy explain plan và bạn sẽ thấy trình tối ưu hóa muốn làm gì. Điều này sẽ áp dụng cho hầu hết các câu hỏi về "có sự khác biệt về hiệu suất giữa ..." hay không. Tất nhiên cũng có rất nhiều công cụ khác, nhưng kế hoạch giải thích là một khởi đầu tốt.

1

nên giống nhau.

Công cụ cơ sở dữ liệu tốt sẽ tạo ra cùng một kế hoạch cho biểu thức đó.

+0

có, nhận xét của tôi là chung chung hơn tình huống cụ thể này. Dạy một người đàn ông ... – tbone

0

Nó có thể là giá trị xem xét các tiêu chuẩn SQL cho điều này (mặc dù này có thể không tương ứng với tất cả hiện thực, thậm chí nếu nó nên):

Format 

<between predicate> ::= 
    <row value constructor> [ NOT ] BETWEEN 
    <row value constructor> AND <row value constructor> 

Syntax Rules 

[...] 

6) "X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z". 

Nói xong, không có sự khác biệt về hành vi, mặc dù đối với phức tạp X, có thể có một sự khác biệt trong thời gian phân tích, như đã đề cập bởi Benoit here

Tìm thấy trong http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

.210
0

run1 "X> = Y VÀ X < = Z"

run2 "X GIỮA Y VÀ Z"

tôi nhận được một Plan hash value khi tôi chạy giải thích kế hoạch hai lần. Nhưng runStats_pkg của Tom nhận được kết quả khác:

Run1 ran in 1 cpu hsecs 
Run2 ran in 1 cpu hsecs 
run 1 ran in 100% of the time 

Name      Run1 Run2  Diff 
STAT...recursive calls   12  13  1 
STAT...CPU used by this sessio  2  3  1 
STAT...physical read total IO  0  1  1 
STAT...consistent gets   18  19  1 
... 
... 
LATCH.row cache objects   44,375 1,121  -43,254 
LATCH.cache buffers chains  68,814 1,397  -67,417 
STAT...logical read bytes from  655,360  573,440  -81,920 
STAT...session uga memory max  123,512  0 -123,512 
STAT...session pga memory  262,144 65,536 -196,608 
STAT...session pga memory max  262,144 65,536 -196,608 
STAT...session uga memory  -327,440 65,488  392,928 

Run1 latches total versus runs -- difference and pct 
Run1  Run2 Diff  Pct 
203,927  28,673 -175,254 711.22% 
Các vấn đề liên quan