[SQL] 절 단락 평가 된 SQL인가?
SQL절 단락 평가 된 SQL인가?
절은 단락 회로 평가 SQL에서 부울 식입니다 ?
예를 들면 :
SELECT *
FROM Table t
WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key)
@key true로 NULL 평가하여 인 경우, @key가와 @key = t.Key 평가 된 NULL 그렇지?
아니, 왜하지?
예 경우, 보장? 그것은 ANSI SQL의 일부 또는 데이터베이스 고유의 것입니다?
데이터베이스의 특정, SQLSERVER하면? 신탁? MySQL은?
해결법
-
==============================
1.ANSI SQL 초안 2003 5WD-01-프레임 워크 - 2003-09.pdf
ANSI SQL 초안 2003 5WD-01-프레임 워크 - 2003-09.pdf
-
==============================
2.위에서 단락 정말 사용할 수 없습니다.
위에서 단락 정말 사용할 수 없습니다.
당신이 그것을 필요로하는 경우에, 나는 Case 문을 제안한다 :
Where Case when Expr1 then Expr2 else Expr3 end = desiredResult
Expr1is은 항상 평가하지만, expr2이의 하나 expr3를은 행마다 평가됩니다.
-
==============================
3.나는 이것이이 단락하지 않았다 것처럼 나는 세 가지 이유를 들어, 쓰기하려는 사례 중 하나라고 생각합니다.
나는 이것이이 단락하지 않았다 것처럼 나는 세 가지 이유를 들어, 쓰기하려는 사례 중 하나라고 생각합니다.
-
==============================
4.나는 SQL 서버 (2005)에서 그 단락을 보장 믿지 않는다. SQL 서버 계정에 일이 많이 걸립니다 자사의 최적화 알고리즘을 통해 쿼리를 실행합니다 (인덱스, 통계, 테이블 크기, 자원 등) 효과적인 실행 계획을 마련한다. 이 평가 후에는 단락 논리가 보장되어 있는지에 대해 말할 수 없습니다.
나는 SQL 서버 (2005)에서 그 단락을 보장 믿지 않는다. SQL 서버 계정에 일이 많이 걸립니다 자사의 최적화 알고리즘을 통해 쿼리를 실행합니다 (인덱스, 통계, 테이블 크기, 자원 등) 효과적인 실행 계획을 마련한다. 이 평가 후에는 단락 논리가 보장되어 있는지에 대해 말할 수 없습니다.
나 자신 언젠가 전에 같은 질문에 달려 내 연구는 정말 저에게 확실한 대답을하지 않았다. 결론 것이다, 당신은 당신에게 그것이 작동하는 증거의 감각을 제공하기 위해 작은 쿼리를 작성할 수 있지만 당신은 당신의 데이터베이스 증가의 부하로, 테이블이 더 큰 것으로 성장 확신 할 수 있습니다, 사물 최적화하고 데이터베이스에 변경 얻을 보류. 나는주의의 측면에 잘못을 범하고 절은 단락을 보장하기 위해 WHERE에서 CASE를 사용하지 따라서 수 있습니다.
-
==============================
5.당신은 데이터베이스의 작동 방식을 명심해야한다. DB를이 매개 변수의 값없이 그 쿼리를 기반으로 실행 계획을 기반으로 매개 변수화 된 쿼리를 감안할 때. 이 쿼리는 쿼리에 관계없이 실제 제공된 값이 무엇인지 실행될 때마다 사용됩니다. 특정 값으로 쿼리 단락 여부를 중요하지 실행 계획을 것입니다.
당신은 데이터베이스의 작동 방식을 명심해야한다. DB를이 매개 변수의 값없이 그 쿼리를 기반으로 실행 계획을 기반으로 매개 변수화 된 쿼리를 감안할 때. 이 쿼리는 쿼리에 관계없이 실제 제공된 값이 무엇인지 실행될 때마다 사용됩니다. 특정 값으로 쿼리 단락 여부를 중요하지 실행 계획을 것입니다.
-
==============================
6.나는 일반적으로 선택적 매개 변수에 대해이 작업을 사용합니다. 이 단락과 같은 것입니까?
나는 일반적으로 선택적 매개 변수에 대해이 작업을 사용합니다. 이 단락과 같은 것입니까?
SELECT [blah] FROM Emp WHERE ((@EmpID = -1) OR (@EmpID = EmpID))
이것은 나에게 속성의 선택 사항 확인을 위해 계정에 -1 또는 무엇이든을 통과 할 수있는 옵션을 제공합니다. 때때로 이것은 여러 테이블, 또는 바람직하게는보기에 합류 포함한다.
아주 편리, 전적으로 반드시 추가 작업이 DB를 엔진에 준다.
-
==============================
7.SQL Server의 경우, 나는 그것이 버전에 따라 달라집니다하지만 SQL 서버 2000와 내 경험이 여전히 @key = t.Key @key가 null의 경우에도 평가하는 것입니다 생각합니다. WHERE 절을 평가할 때 즉, 효율적인 단락하지 않습니다.
SQL Server의 경우, 나는 그것이 버전에 따라 달라집니다하지만 SQL 서버 2000와 내 경험이 여전히 @key = t.Key @key가 null의 경우에도 평가하는 것입니다 생각합니다. WHERE 절을 평가할 때 즉, 효율적인 단락하지 않습니다.
나는 사용자가 입력하거나 다양한 기준을 입력 할 수있는 유연한 쿼리를 수행하는 방법으로 예를 들어 같은 구조를 추천 사람을 본 적이있다. 내 관찰 @key가 null 인 경우 키는 여전히 쿼리 계획에 관여한다는 것입니다 및 키 인덱스의 경우, 효율적으로 인덱스를 사용하지 않습니다.
다양한 기준에 유연한 쿼리 이런 종류의 아마 동적으로 생성 된 SQL 정말 갈 수있는 가장 좋은 방법 일 경우입니다. @key가 null의 경우, 당신은 단순히 모두에서 쿼리에 포함되지 않습니다.
-
==============================
8.그냥이 질문을 통해 발견, 이미이 블로그 항목을 발견했다 : http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/
그냥이 질문을 통해 발견, 이미이 블로그 항목을 발견했다 : http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/
SQL 서버는 어디 그녀는 너무 블로그 게시물에 주어진 예를 들어, 당신은 단락에 의존하지 수, 적합을 보는 쿼리를 최적화 무료입니다.
이 블로그 게시물의 의견을 확인 - 그러나, CASE 분명히 기록 된 순서대로 평가하기 위해 설명되어 있습니다.
-
==============================
9.단락 평가의 주요 특징은 즉시 그 결과를 판별 할 수있는 식을 평가하는 것을 중단한다. 결과에 관계없이 평가되지 않았거나 동일하기 때문에 표현의 나머지 그 말은 무시 될 수있다.
단락 평가의 주요 특징은 즉시 그 결과를 판별 할 수있는 식을 평가하는 것을 중단한다. 결과에 관계없이 평가되지 않았거나 동일하기 때문에 표현의 나머지 그 말은 무시 될 수있다.
바이너리 부울 연산자는 교환 법칙이 성립 의미입니다 :
a AND b == b AND a a OR b == b OR a a XOR b == b XOR a
그래서 평가의 순서에 대한 보장은 없습니다. 평가의 순서는 쿼리 옵티 마이저에 의해 결정됩니다.
객체 언어로 된 경우에만 단락 회로 평가로 평가 될 수 부울 표현식을 쓸 수있는 상황이있을 수있다. 샘플 코드 구조는 종종 언어 사용 (C #을, 델파이, VB). 예를 들면 :
if(someString == null | someString.Length == 0 ) printf("no text in someString");
완전히 평가되기 때문 C # 예제는 예외의 경우 someString == null의 원인이됩니다. 단락 회로 평가에서는 모든 시간을 작동합니다.
SQL은 초기화되지 않은 수 없습니다 스칼라 변수 (물체를)에서 작동하므로 평가할 수 없습니다 부울 식을 작성하는 방법은 없습니다. 일부 NULL 값이있는 경우, 모든 비교는 false를 돌려줍니다.
SQL에서 다르게 단락 또는 전체 평가를 사용하는 방법에 따라 평가되는 표현을 쓸 수 있다는 것을 의미한다.
SQL 구현이 단락 회로 평가를 사용하는 경우, 그것은 단지 희망 쿼리 실행 속도를 높일 수 있습니다.
-
==============================
10.내가 단락에 대해 잘 모르겠지만, 나는 경우-else 문으로 써서
내가 단락에 대해 잘 모르겠지만, 나는 경우-else 문으로 써서
if (@key is null) begin SELECT * FROM Table t end else begin SELECT * FROM Table t WHERE t.Key=@key end
또한, 변수가 항상 식의 우측에 있어야한다. 이것은 스 SARGable 수 있습니다.
http://en.wikipedia.org/wiki/Sargable
-
==============================
11.SQL 서버 2008 R2에 대한 신속하고 더러운 테스트 아래 :
SQL 서버 2008 R2에 대한 신속하고 더러운 테스트 아래 :
SELECT * FROM table WHERE 1=0 AND (function call to complex operation)
이것은 어떤 기록을 즉시 반환합니다. 단락 행동 종류 존재 하였다.
그런 다음이 시도 :
SELECT * FROM table WHERE (a field from table) < 0 AND (function call to complex operation)
어떤 기록을 알 수없는 것은이 조건을 만족하는 것입니다 :
(a field from table) < 0
이 단락 회로 동작은 더 이상 없었다 및 복잡한 작업이 모든 레코드에 대해 평가되고 있었다 나타내는 몇 초 걸렸습니다.
이 사람을 도움이되기를 바랍니다.
-
==============================
12.여기에 MySQL은 WHERE 절 단락을 수행한다는 것을 증명하는 데모입니다 :
여기에 MySQL은 WHERE 절 단락을 수행한다는 것을 증명하는 데모입니다 :
http://rextester.com/GVE4880
이것은 다음과 같은 쿼리를 실행합니다 :
SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1; SELECT myint FROM mytable WHERE myslowfunction('query #2', myint) = 1 OR myint >= 3;
이들 사이의 유일한 차이점은 OR 조건에서 피연산자의 순서이다.
myslowfunction 의도적 잠시 인용하고 로그 테이블에 엔트리가 실행될 때마다 추가하는 부작용이있다. 여기에 두 개의 쿼리 위를 실행할 때 로그인 한 일의 결과는 다음과 같습니다
myslowfunction called for query #1 with value 1 myslowfunction called for query #1 with value 2 myslowfunction called for query #2 with value 1 myslowfunction called for query #2 with value 2 myslowfunction called for query #2 with value 3 myslowfunction called for query #2 with value 4
다른 피연산자 (인한 단락에) 항상 진실 않을 때 그것이 OR 조건의 좌측에 나타날 때 상기 방송 느린 함수 회 이상 실행된다.
-
==============================
13.이것은 너무도 단락되지 제가 IF를 볼 수 있습니다에서, 쿼리 분석기에 추가 사초를 걸립니다 ...
이것은 너무도 단락되지 제가 IF를 볼 수 있습니다에서, 쿼리 분석기에 추가 사초를 걸립니다 ...
SET @ADate = NULL IF (@ADate IS NOT NULL) BEGIN INSERT INTO #ABla VALUES (1) (SELECT bla from a huge view) END
보장 방법이 좋을 것이다!
-
==============================
14.그것은하지만 MS SQL 서버 지원 짧은 회로 이론, 불필요한 검사를 피함으로써 성능을 향상 분명,
그것은하지만 MS SQL 서버 지원 짧은 회로 이론, 불필요한 검사를 피함으로써 성능을 향상 분명,
예를 지원 :
SELECT 'TEST' WHERE 1 = 'A' SELECT 'TEST' WHERE 1 = 1 OR 1 = 'A'
여기서, 첫 번째 예는 에러로 초래 '는 VARCHAR 값을 변환 할 때 변환이 실패'int 데이터 형식입니다. '
TRUE로 평가 된 조건 1 = 1 쉽게 두 번째 실행하므로 두 번째 조건은 전혀 실행되지 않지만.
또한 더
SELECT 'TEST' WHERE 1 = 0 OR 1 = 'A'
여기에 첫 번째 조건은 false로 평가되는 것이며, 따라서 DBMS는 두 번째 조건 갈 것 다시 위의 예에서와 같이 변환의 오류가 발생합니다.
참고 : 나는 날씨 조건이 실행되고 잘못된 조건 JUST TO의 실현 또는 단락을 썼는지 IF 쿼리는 오류가 실행 조건, 달리 단락을 의미 발생합니다.
간단한 설정 설명
치다,
WHERE 1 = 1 OR 2 = 2
첫 번째 조건이 TRUE로 평가 받고 한, 그 의미는 두 번째 조건을 평가하기 때문에 어떤 가치의 평가 SQL Server의 경우는 좋은 기회가 필요 조건 검사 또는 평가를 건너 뛰어 쿼리 실행 시간을 절약 할 수 있도록, 모든의 결과에 영향을주지 않습니다.
경우 "OR"제 조건이 TRUE로 접속하여 전체 체인을 평가하는 경우 등을 평가 않고 참으로 평가 "OR"로 간주한다.
condition1 OR condition2 OR ..... OR conditionN
조건 1이 true로 평가되는 경우, 생략 된 것 conditionN까지 모든 조건을 휴식. OR로 연결된 제 TRUE, 다른 모든 조건의 판정에 일반화 즉 생략 될 것이다.
두 번째 조건을 고려
WHERE 1 = 0 AND 1 = 1
첫 번째 조건이 FALSE로 evalutated지고로서의 의미는 두 번째 조건을 평가하기 때문에 어떤 가치의 평가 필요 조건 검사 또는 평가를 건너 뛰어 쿼리 실행 시간에 저장하기 때문에 다시, 모두에서 SQL Server의 경우 그것의 좋은 기회를 결과에 영향을주지 않습니다.
있는 경우는 "AND"기타 평가없이 FALSE로 평가로서 제 조건은 FALSE로 "AND"것이라고 간주 접속 전체 체인을 평가하는 경우.
condition1 AND condition2 AND ..... conditionN
조건 1이 FALSE로 평가되는 경우, 생략 된 것 conditionN까지 모든 조건을 휴식. 제 FALSE 결정에서 일반화 즉, 다른 모든 조건에 의해 연결된 AND은 생략 될 것이다.
그 때문에, 평가를 취득 FIRST 비싸거나 제거 MOST CONDITION LESS, 이러한 방식으로 조건 WISE PROGRAMMER SHOULD ALWAYS 프로그램 체인 또는 단락 회로의 최대의 이익을 취할 수있는 방법으로 조건을 마련
from https://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit-evaluated by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] PostgreSQL을 GROUP_CONCAT 동등한? (0) | 2020.03.10 |
---|---|
[SQL] SQL은 - VS 어디를 가진 (0) | 2020.03.10 |
[SQL] ()는 SQL IN의 값의 순서에 의해 절을 주문 (0) | 2020.03.10 |
[SQL] IN 성능 대 MYSQL OR (0) | 2020.03.10 |
[SQL] 오라클의 다중 행 삽입을 할 수있는 가장 좋은 방법은? (0) | 2020.03.10 |