논리 연산자 OR AND WHERE의 조건 및 조건 순서


33

이 두 문장을 살펴 보자.

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

경우 CONDITION 1IS TRUE, 것입니다 CONDITION 2확인?
경우 CONDITION 3IS FALSE, 것입니다 CONDITION 4확인?

무엇에 조건에 대한 WHERE: A의 수행하는 SQL Server 엔진의 최적화 모든 조건 WHERE절? 프로그래머 가 SQL Server 최적화 프로그램이 올바른 방식으로 조건을 해결하도록 조건을 올바른 순서로 배치해야합니까 ?

추가 :

t-sql 코드에서 놀라운 링크를 제공 한 Jack에게 감사드립니다.

IF  1/0 = 1 OR 1 = 1
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result


IF  1/0 = 1 AND 1 = 0
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result

이 경우에는 0 으로 나누기 예외가 발생 하지 않습니다 .

결론:

C ++ / C # / VB에 단락이 발생하면 왜 SQL Server를 사용할 수 없습니까?

이 질문에 진정으로 답하기 위해 두 조건이 어떻게 작동하는지 살펴 보겠습니다. C ++ / C # / VB는 모두 코드 실행 속도를 높이기 위해 언어 사양에 정의 된 단락이 있습니다. 첫 번째 조건이 이미 참인 경우 N OR 조건을 평가하거나 첫 번째 조건이 이미 거짓 인 경우 M AND 조건을 평가해야하는 이유는 무엇입니까?

개발자는 SQL Server가 다르게 작동한다는 것을 알고 있어야합니다. 비용 기반 시스템입니다. 쿼리에 대한 최적의 실행 계획을 얻으려면 쿼리 프로세서가 모든 위치 조건을 평가하고 비용을 할당해야합니다. 그런 다음 이러한 비용을 전체적으로 평가하여 SQL Server가 제대로 계획하기 위해 정의 된 임계 값보다 낮아야하는 임계 값을 형성합니다. 비용이 정의 된 임계 값보다 낮 으면 계획이 사용되지만 그렇지 않은 경우 전체 조건이 다른 조건 비용 조합으로 다시 반복됩니다. 여기서 비용은 스캔 또는 탐색 또는 병합 조인 또는 해시 조인 등입니다.이 때문에 C ++ / C # / VB에서 사용 가능한 단락은 불가능합니다. 열에 인덱스를 강제로 사용하면 단락으로 간주되지만 그렇지는 않다고 생각할 수 있습니다. 그것은 단지 그 인덱스의 사용을 강요하고 그것으로 가능한 실행 계획의 목록을 단축시킵니다. 시스템은 여전히 ​​비용 기반입니다.

개발자는 SQL Server가 다른 프로그래밍 언어에서와 같이 단락을 일으키지 않으며 강제로 할 수있는 일이 없다는 것을 알고 있어야합니다.


최종 견적 블록의 출처는 어디입니까? 참조를 추가 할 수 있습니까?
Nick Chammas

답변:


25

명령문이 명령문에서 처리되는 순서 또는 순서를 SQL Server에서 보장하지 않습니다 WHERE. 명령문 단락을 허용하는 단일 표현식은 CASE- WHEN입니다. 다음은 내가 Stackoverflow에 게시 한 답변입니다.

SQL Server가 조건 평가를 단락시키는 방법

그것은 느낌이들 때, 그러나 당신이 즉시 생각하는 방식으로는 그렇지 않습니다.

개발자는 SQL Server가 다른 프로그래밍 언어에서와 같이 단락을 일으키지 않으며 강제로 할 수있는 일이 없다는 것을 알고 있어야합니다 .

자세한 내용은 위의 블로그 항목에서 첫 번째 링크를 확인하여 다른 블로그로 연결하십시오.

SQL Server는 단락입니까?

최종 평결? 글쎄, 아직 하나는 없지만, 특정 단락을 보장 할 수있는 유일한 시간은 CASE 표현식에서 여러 WHEN 조건을 표현할 때 뿐이라고 말하는 것이 안전합니다 . 표준 부울 표현식을 사용하면 옵티마이 저는 쿼리하는 테이블, 인덱스 및 데이터에 따라 적절하게 이동합니다.



1
또한 다음과 같은 또 다른 사례 (ha!)를 보여줍니다 CASE. dba.stackexchange.com/questions/12941/…
Aaron Bertrand


0

SQL은 선언적 프로그래밍 언어입니다. 예를 들어, C ++은 명령형 프로그래밍 언어입니다.

즉 , 최종 결과에서 원하는 것을 말할 수는 있지만 결과가 어떻게 실행 되는지 지시 할 수는 없습니다 . 모두 엔진에 달려 있습니다.

내부의 "단락"(또는 다른 제어 흐름 ) 을 보장하는 유일한 방법 WHERE은 인덱싱 된 뷰, 임시 테이블 및 유사한 메커니즘을 사용하는 것입니다.

추신. 또한 실행 계획 힌트를 사용하여 (엔진에 쿼리를 실행하는 방법, 사용하는 인덱스 및 사용 방법을 엔진에 "힌트"), 언급해야한다고 생각했습니다.


-4

1)-또는 (조건 중 하나 또는 둘 다 참)

조건 1이 TRUE이면 조건 ​​2도 확인됩니다. TRUE 또는 FALSE 일 수 있습니다.

--AND (두 조건 모두 참이어야 함)

조건 1이 FALSE이면 조건 ​​2가 점검되지 않습니다.


"조건 1이 거짓이면 조건 ​​2가 점검되지 않습니다"이것은 사실이 아닙니다. 위의 답변을 참조하십시오 . SQL Server는 WHERE절 에서 단락 평가를 수행하지 않기 때문에 여전히 조건 2를 평가할 수 있습니다 .
Nick Chammas

-4

WHERE 절의 조건을 제어하는 ​​유일한 방법은 대괄호를 사용하여 조건을 그룹화하는 것입니다.

WHERE Col1 = 'Something' AND Col2 = 'Something' OR Col3 = 'Something' and Col4 = 'Something'

~와는 매우 다릅니다

WHERE (Col1 = 'Something' AND Col2 = 'Something') OR (Col3 = 'Something' and Col4 = 'Something')

그냥 궁금해서 이 두 조건은 어떻게 다릅니 까? 다른 결과, 성능, 실행 계획? 나는 그들이 동등한 것이라고 생각했다.
ypercubeᵀᴹ

첫 번째로 Col1, Col4 및 Col2 또는 Col3과 일치해야합니다. 두 번째 줄에서 Col1과 Col2를 일치 시키거나 Col3과 Col4를 일치시켜야하지만 Col1과 Col4를 함께 평가할 필요는 없습니다.
mrdenny

1
아니, 넌 잘못 되었어. AND보다 우선 순위가 높습니다 OR. 둘 다 동일합니다. 당신이 말하는 것은 WHERE Col1 = x AND (Col2 = x OR Col3 = x) AND Col4 = x쿼리에 해당됩니다.
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.