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
님은 표준 >= 및 <=의 조합과는 다른 실행 계획을 가질 수 있습니다.
경고 공허자는 분명합니다.그러나 실행 계획은 시간이 지남에 따라 변경될 수 있고, 저는 그런 것들을 테스트하고 싶은 욕구가 없기 때문에 BETWEEN은 전혀 사용하지 않습니다.
때로는 선택의 폭이 적을 때가 더 낫다.
언급URL : https://stackoverflow.com/questions/4809083/between-clause-versus-and
'programing' 카테고리의 다른 글
ReactJs에서 문서를 작성하는 방법 (0) | 2023.04.04 |
---|---|
부트스트랩 네비게이션 바를 WordPress 메뉴로 변환 (0) | 2023.04.04 |
ESLint - 오류:ES 모듈을 로드하려면 Import를 사용해야 합니다. (0) | 2023.04.04 |
SqlDataReader에서 JSON으로 변환 (0) | 2023.03.25 |
지도 배열의 값을 jq로 합산하려면 어떻게 해야 합니까? (0) | 2023.03.25 |