BETWEEN clause versus <= AND >=

前端 未结 8 1318
無奈伤痛
無奈伤痛 2020-12-14 05:54

Is there a performance difference between using a BETWEEN clause or using <= AND >= comparisons?

i.e. these two queries:

SELECT *  
  FROM table           


        
相关标签:
8条回答
  • 2020-12-14 06:28

    Actually it depends on your DBMS engine.

    Some database management systems will compute twice your expression (once for each comparison), and only once when you use BETWEEN.

    Actually if the expression can have a non-deterministic result BETWEEN will have a different behaviour, compare the following in SQLite:

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

    This can be very time consuming if your expression is (for example) a subquery.

    0 讨论(0)
  • 2020-12-14 06:28

    It should be the same.

    Good database engine will generate same plan for that expression.

    0 讨论(0)
  • 2020-12-14 06:35

    When in doubt (for Oracle anyway), run an explain plan and you'll see what the optimizer wants to do. This would apply to most questions about "is there a performance difference between ...". Of course there are a lot of other tools also, but explain plan is a good start.

    0 讨论(0)
  • 2020-12-14 06:35

    run1 "X>=Y AND X<=Z"

    run2 "X BETWEEN Y AND Z"

    I get one Plan hash value when I run explain plan twice. But Tom's runStats_pkg get diffent result:

    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%
    
    0 讨论(0)
  • 2020-12-14 06:41

    You better check your execution plans because there can be some weird edge cases where BETWEEN can have a different execution plan from the standard >= and <= combination.

    https://blog.pythian.com/oracle-can-between-and-greater-than-or-equal-to-and-less-than-or-equal-to-differ/

    Caveat emptor obviously. But since execution plans can change over time and I really do not have an appetite to test such things, I rather not use BETWEEN at all.

    Sometimes less choice is better.

    0 讨论(0)
  • 2020-12-14 06:43

    There is no difference.

    Note that BETWEEN is always inclusive and sensitive to the order of the arguments.

    BETWEEN '2010' AND '2005' will never be TRUE.

    0 讨论(0)
提交回复
热议问题