2009-07-11 3 views
1
SELECT 
    * 
FROM 
    myTable 
WHERE 
    field1 LIKE 'match0' AND 
    myfunc(t1.hardwareConfig) LIKE 'match1' 

내 질문은 뒤에이 쿼리를 수행합니다어떻게 SQL Server는 장면 여기

필드 1의 매칭 빠르고 신속하게,하지만 돌아 영원히 myfunc에 걸리고 난 그 경우 필드 1 아무튼 있는지 확인하려면 myfunc를 시도조차하지 않는다는 사실과 일치하지 않습니다.

SQL이이 사실을 알고 있거나 내 쿼리에서 명시 적으로 만들 수 있습니까?

저는 MSSQL 2000, 2005 및 2008에 있습니다. 잘만되면 일반적인 대답이 있습니다.

+1

myspvs 란 무엇입니까? 그렇게 사용할 수 없으므로 저장 프로 시저 일 수 없습니다. –

+0

err은 저장 프로 시저 대신 함수를 의미합니다. – Matt

+0

가장 좋은 답변을 제외하고 다른 답변을보십시오. 대답은 당신이 그것에 대해 걱정할 필요가 없다는 것입니다 : SQL은 당신을 위해 그것을 알아낼 것입니다. –

답변

7

조건이 평가되는 순서를 적용하려면 CASE가 조건이 평가되는 순서를 유지하도록 문서화되어 있기 때문에 다음 방법을 사용하십시오.

SELECT 
     * 
FROM 
     myTable 
WHERE 
    CASE WHEN field1 LIKE 'match0' THEN 
    CASE WHEN myfunc(t1.hardwareConfig) LIKE 'match1' 
     THEN 1 
    END 
    END = 1 

다음 문서에서는 좋은 자세하게 설명 : Predicates in SQL

1

쿼리가 실행되는 방식을 결정하기 위해 장면 뒤에는 많은 것이 있지만,이 경우에는 이 먼저 필드 1에서 필터링하려면이 필요합니다. 이것은 보장이 아니므로 쿼리 최적화 프로그램에서 이상한 선택을 할 수 있습니다. 또한 'LIKE'연산자 대신 '='연산자를 사용하여 기회를 향상시킬 수 있습니다.

1

mysp은 저장 프로 시저 일 수 없습니다. 스키마는 사용자 정의 함수 여야합니다 (스키마 이름으로 정규화해야 함). 사용자 정의 함수는 부작용이 없도록 제한되어 있으며 일부 규칙을 따라야합니다. 본질적으로 SQL Server는 쿼리를 결합하여 단일 실행 계획으로 단일 모듈로 실행합니다. 예상대로 프로 시저 호출이 아닙니다. SQL은 수행 방법이 아닌 수행해야 할 작업을 설명하며, 쿼리 최적화 프로그램은 별도의 각 부분이 아닌 전체 쿼리에 응답하는 계획을 생성합니다. 보기에도 마찬가지입니다.

1

SQL Server Management Studio (2008 및 2005 버전)에서 실행 계획을 보여 줄 수 있습니다. 쿼리 창에서 Control-M을 누릅니다. 그런 다음 쿼리를 실행하십시오. 그러면 세부 사항이 표시됩니다.

0

그냥 복잡한 계산 myfunc 아니면 자주 반환 값을 변경한다. 자주 변경되지 않고 자주 실행되는 쿼리이기 때문에 삽입 트리거가 값을 계산하고 별도의 열로 테이블에 저장하는 것이 더 좋은 디자인 일 수 있기 때문에 궁금합니다. 그렇다면 어떤 순서로 평가되는지에 대해 걱정할 필요가 없습니다. 쿼리가 더 빠르게 실행될 수도 있습니다. 특히 두 열 모두에 인덱스가있는 경우 특히 그렇습니다.