programing

BETWIN 절 대 <= AND >=

newstyles 2023. 4. 4. 21:08

BETWIN 절 대 <= AND >=

BETHN 절을 사용하는 것과 <= AND >= 비교를 사용하는 것 사이에 성능 차이가 있습니까?

즉, 다음 두 가지 질문:

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

...그리고.

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

이 예에서 year 열은 VARCHAR2(4)이며 인덱스가 표시됩니다.

차이가 없다.

주의:BETWEEN는 항상 포함되며 인수 순서에 민감합니다.

BETWEEN '2010' AND '2005'결코 그렇지 않을 것이다TRUE.

두 예제 쿼리 간에 성능 차이는 없습니다.BETWEEN포괄적 범위 비교를 표현하는 간단한 방법입니다.Oracle이 해석하는 경우BETWEEN조건은 자동으로 개별 비교 절로 확장됩니다.

예를 들어,

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

...는 자동으로 다음과 같이 됩니다.

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

실제로는 DBMS 엔진에 따라 달라집니다.

일부 데이터베이스 관리 시스템에서는 식을 2배(비교할 때마다 1회) 계산하고 사용할 때는 1회만 계산한다.BETWEEN.

사실 그 표현이 비결정론적 결과를 가져올 수 있다면BETWEEN는 다른 동작을 합니다.SQLite에서 다음을 비교합니다.

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

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

표현식이 (예를 들어) 서브쿼리일 경우 시간이 많이 걸릴 수 있습니다.

(Oracle의 경우) 확실하지 않은 경우 설명 계획을 실행하면 최적기가 무엇을 원하는지 알 수 있습니다.이는 "... 사이에 성능 차이가 있는가?"에 대한 대부분의 질문에 해당됩니다.물론 다른 많은 도구도 있지만 계획을 설명하는 것이 좋은 시작입니다.

똑같아야 합니다.

데이터베이스 엔진이 정상일 경우 해당 식에 대해 동일한 계획이 생성됩니다.

이에 대한 SQL 표준을 고려할 필요가 있습니다(이것이 모든 구현에 해당하지는 않을 도 있습니다).

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

그렇다고는 해도, 복잡한 것은 아니지만, 행동에는 차이가 없습니다.X, 여기 Benoit에서 언급한 바와 같이 해석 시간에 차이가 있을 수 있습니다.

http://www.contrib.andrew.cmu.edu/~http/sql/sql1992.txt에 있습니다.

실행 1 "X>=Y 및 X <=Z"

run2 "X between Y and Z"

하나 찾았어요Plan hash value두 번 실행했을 때 계획을 설명하라.그러나 Tom의 runStats_pkg은 다른 결과를 얻습니다.

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%

실행 계획을 확인해 보는 게 좋을 거야 이상한 사건이 생길 수도 있으니까BETWEEN님은 표준 >= 및 <=의 조합과는 다른 실행 계획을 가질 수 있습니다.

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

경고 공허자는 분명합니다.그러나 실행 계획은 시간이 지남에 따라 변경될 수 있고, 저는 그런 것들을 테스트하고 싶은 욕구가 없기 때문에 BETWEEN은 전혀 사용하지 않습니다.

때로는 선택의 폭이 적을 때가 더 낫다.

언급URL : https://stackoverflow.com/questions/4809083/between-clause-versus-and