복붙노트

[SQL] "절"평가 순서를 선택합니다

SQL

"절"평가 순서를 선택합니다

나는 여러 매개 변수가있는 경우는 SQL Server 2005에서는 내가 평가 순서는 항상에서 왼쪽에서 오른쪽으로 될 것이라는 보장이 있습니까?

예를 들어 사용 :

은 "C = 1"조건이 실패 할 경우이 쿼리에서 "D = 2"조건은 평가되지 않습니다?

PS- "C"는 정수 인덱스 열이고, (D)는 전체 테이블 스캔을 필요로하는 대형 VARCHAR 비 색인 열인

나는 두 개의 질의 또는 조건문을 수행 피하려고 노력했다 업데이트, 난 그냥 뭔가를해야합니다 : "C 조건은"그것은 내 경우에는 필요하지 이후 무거운에게 "D 조건"을 수행하지 않도록 할 수있는 방법이있다 실패하면.

해결법

  1. ==============================

    1.평가 순서에 대한 보장은 없습니다. 옵티마이 저는 가능한 정보를 사용하여 쿼리를 실행하는 가장 효율적인 방법을 찾기 위해 노력할 것입니다.

    평가 순서에 대한 보장은 없습니다. 옵티마이 저는 가능한 정보를 사용하여 쿼리를 실행하는 가장 효율적인 방법을 찾기 위해 노력할 것입니다.

    C는 인덱스이고, d는되지 않기 때문에 귀하의 경우, 옵티마이 저는 다음, C의 조건과 일치하는 모든 행을 찾을 D에 술어를 평가하기 위해 테이블 ​​데이터에서 해당 행을 검색 색인에 보일 것입니다.

    그것은 C에 인덱스가 (당신의 예에서, 성별 열이 거의 유용하게 인덱싱되지 않은 것은 아니지만) 매우 선택적 아니라고 결정하는 경우,이 테이블을 스캔 어쨌든을 결정할 수 있습니다.

    실행 순서를 결정하려면, 당신은 당신의 쿼리에 대한 계획을 설명 할 수 있어야합니다. 그러나 그 계획은 지금 최고의 쿼리 무엇 최적화 생각에 따라 변경 될 수 있음을 알고 있습니다.

  2. ==============================

    2.SQL Server는 실행 각 문에 대한 최적화 계획을 생성합니다. 당신은 그 혜택을 얻을 수 있도록 where 절을 주문할 필요가 없습니다. 당신이 가진 유일한 garuntee는 순서 그래서에서 문을 실행하는 것입니다 :

    SQL Server는 실행 각 문에 대한 최적화 계획을 생성합니다. 당신은 그 혜택을 얻을 수 있도록 where 절을 주문할 필요가 없습니다. 당신이 가진 유일한 garuntee는 순서 그래서에서 문을 실행하는 것입니다 :

    SELECT A FROM B WHERE C
    SELECT D FROM E WHERE F
    

    두 번째 전에 첫 번째 줄을 실행합니다.

  3. ==============================

    3.당신은 쿼리의 실행 계획을보고 실제로 일을하려고 있는지 확인할 수 있습니다. 나는 SQL 서버의 쿼리 엔진은 스캐닝 이런 종류의 일을 할 예정이다 지능적 운영에 번역 것이라 생각합니다. 당신이 "비싼 영업 이익과 false"로 할 경우처럼, 그것은 거짓에 신속을 평가합니다.

    당신은 쿼리의 실행 계획을보고 실제로 일을하려고 있는지 확인할 수 있습니다. 나는 SQL 서버의 쿼리 엔진은 스캐닝 이런 종류의 일을 할 예정이다 지능적 운영에 번역 것이라 생각합니다. 당신이 "비싼 영업 이익과 false"로 할 경우처럼, 그것은 거짓에 신속을 평가합니다.

    내가 배운 바로는, 당신이 입력하는 것은 실제로 실행 무슨 다른 (그리고 될 수 있습니다). 당신은 단지 당신이 기대하는 결과 어떤 종류의 서버를 말하는 것입니다. 그 대답은 상관 관계를 왼쪽에서 오른쪽으로하지 않습니다 당신이 제공하는 코드를 얻는 방법.

  4. ==============================

    4.당신이 확인하고 싶은 경우에 당신은 쿼리 실행 계획을 확인할 수 있습니다. MSSQL이 /를 최적화를 구축한다는 실행 계획은 VARCHAR 컬럼 전에 인덱스 열을 확인하는 스마트 충분하다.

    당신이 확인하고 싶은 경우에 당신은 쿼리 실행 계획을 확인할 수 있습니다. MSSQL이 /를 최적화를 구축한다는 실행 계획은 VARCHAR 컬럼 전에 인덱스 열을 확인하는 스마트 충분하다.

  5. ==============================

    5.단락은 우리가 참조하는 조건은 리터럴 또는 상수를 포함 할 때 이루어집니다. 그래서 예를 들면 우리가 1에서 10까지의 모든 긍정적 인 숫자 열 NUM이있는 테이블 TableA의를 가지고 말할 수 그럼 내가이 쿼리를 작성합니다.

    단락은 우리가 참조하는 조건은 리터럴 또는 상수를 포함 할 때 이루어집니다. 그래서 예를 들면 우리가 1에서 10까지의 모든 긍정적 인 숫자 열 NUM이있는 테이블 TableA의를 가지고 말할 수 그럼 내가이 쿼리를 작성합니다.

    TableA의 TableA.num <0, 1/0 = 10에서 선택 NUM.

    이 오류가 발생합니다.

    내 두 번째 절은 테이블이나 인덱스에서 어떤 검사를 필요로 절을 평가하기 전에 평가해야하므로 상수로 구성되어 있는지 결정하기 위해 컴파일러 스마트 정도인가?

  6. ==============================

    6.평가의 순서를 제어하는 ​​방법 중 하나는 CASE 표현식입니다.

    평가의 순서를 제어하는 ​​방법 중 하나는 CASE 표현식입니다.

    [편집하다]

    내가 표현하려고했다 인기의 의견이었다 :

    이 사이트 아래에 설명 된대로 그 이상 약간 복잡 얻을 않습니다 :

    http://blogs.msdn.com/b/bartd/archive/2011/03/03/don-t-depend-on-expression-short-circuiting-in-t-sql-not-even-with-case.aspx

  7. ==============================

    7.는 MS SQL Server 쿼리 최적화 프로그램은 네 단락을 수행합니다. 보장.

    는 MS SQL Server 쿼리 최적화 프로그램은 네 단락을 수행합니다. 보장.

    이 프로그램을 실행 :

    select 1 where 1 = 0 and 1 / 0 = 10
    

    그것은 쿼리 최적화 프로그램이 단락은 where 절을 평가하기 때문에 당신이 0으로 나누어있어 비록 오류가 잘 실행되지 않습니다. 이것은 당신이 "와"-ing와 중 하나 및 부품있는 거 절은 상수이다 어떤에 대한 의미를 가지고있다.

  8. from https://stackoverflow.com/questions/484135/select-where-clause-evaluation-order by cc-by-sa and MIT license