2017-12-28 62 views
0

열이 포함되어 있으면 쿼리 성능이 영향을 받지만 열이 포함되어 있으면 긍정적 인 (시간 실행 줄임)에 영향을줍니다.열을 포함하면 쿼리 성능이 향상됩니다.

쿼리는 몇 뷰, 일부 테이블에 조인과 같은 기능을 평가 상정 포함 다음 :

SELECT 
    v1.field1, t2.field2 
FROM 
    view v1 WITH (nolock) 
INNER JOIN 
    table t1 WITH (nolock) ON v.field1 = t1.field1 
INNER JOIN 
    table2 t2 WITH (nolock) ON t2.field2 = t1.field2 
INNER JOIN 
    function1(@param) f1 ON f1.field3 = t2.field3 
WHERE 
    (v.date1 = @param OR v.date2 = @param) 

내가보기의 일부 (인 selectvarchar(200) not null 열 내에 포함 할 경우 문제는있다 원래 테이블이나 뷰에서 인덱싱되지 않고 제약 조건이 아님), 쿼리 성능은 X 초입니다. 그러나이를 포함하지 않으면 성능이 4 배속으로 향상됩니다. 이는 많은 차이가 있습니다 단지 칼럼을 포함하기 위해서;

SELECT 
    v1.field1, t2.field2, v1.fieldWhichAffectsPerformance 
    view v1 WITH (nolock) 
INNER JOIN 
    table t1 WITH (nolock) ON v.field1 = t1.field1 
INNER JOIN 
    table2 t2 WITH (nolock) ON t2.field2 = t1.field2 
INNER JOIN 
    function1(@param) f1 ON f1.field3 = t2.field3 
WHERE 
    (v.date1 = @param OR v.date2 = @param) 

그것은,하지만 부정적으로 실제 성능에 영향을주지 않고 쿼리 성능을 향상 열을 제거하기 위해 필수입니다 : 그래서 최적의 성능으로 쿼리처럼 될 것입니다. 어떤 아이디어?

EDIT : 제안 된대로 실행 계획을 검토 한 결과 열이없는 쿼리가 추가 해시 일치 (왼쪽 외부 조인)를 실행하고 인덱스 스캔을 사용하여 많은 CPU 비용이 소요되는 인덱스 검색을 사용합니다. 포함 된 열의 쿼리. 성능에 영향을 미치지 않고 어떻게 컬럼을 제거 할 수 있습니까? 어떤 아이디어?

+2

select의 열과 함께 실행 계획을 게시하십시오. 통계가 최신인지 확인하십시오. –

+0

[나쁜 습관을 걷어차 - 어디에서나 NOLOCK을 퍼트십시오] (http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - 권장하지 않습니다. * 어디서나 이것을 사용하십시오 - 그 반대입니다! –

+0

정렬이 사용되지 않습니다. – oswaldomm2

답변

0

옵티 마이저가 복잡합니다. 쿼리 계획이 없다면 추측 만있을뿐입니다. 실제 답변을 얻으려면 쿼리 계획을 조사해야합니다.

하나의 가능성이 처리 순서입니다. on 조건이 두 테이블의 열이 동일한 지 지정하기 때문에

SELECT t1.field1, t2.field2 

다음 select 등가로 기록 될 수있다. 옵티마이 저는 내 생각에 or이 뷰에서 인덱스를 사용하지 못하도록합니다 (어쨌든 적용 할 수 없을 수도 있음). 따라서보기를 검사하는 대신 table1을 검사 한 다음보기를 가져옵니다.

select에 추가 열을 포함 시키면 옵티마이 저가 뷰를 스캔하도록 밀어 넣기 때문에 더 나은 실행 계획이 될 수 있습니다.

이것은 모두 가설 적이지만 관찰 된 타이밍이 발생할 수있는 방법에 대한 메커니즘을 제공합니다.