2

col_1, col_2, col_3, col_4, col_n의 세 열로 된 인덱스가있는 테이블에서 SP가 실행됩니다. 콜 1은 신분입니다. 그 순서대로 col_2, col_3, col_4에 대한 색인이 있습니다.쿼리 계획에서 검색 조건 값이 null 인 경우 키 조회가 99 %로 표시됩니다.

나는

@parameter=1 

SELECT col_2,col_3,col_4 
WHERE [email protected] 
AND col_3='2' 
AND col_4=10.00 

같은 그것은 내가 전에 언급하지만

@paramete =null; -- the parameter is null in this case when parameter 
has value it uses the index 

SELECT col_2,col_3,col_4 
WHERE (@parameter is null OR col_2 = @parameter) 
AND col_3='2' 
AND col_4=10.00 

뭔가를 조회 할 경우는 키와 쿼리 계획을 보여줍니다 인덱스를 사용하여 쿼리 할 때와 컬럼 col_1에 찾아 99 % 비용.

간혹 값이 null이고 그와 같이 유지해야합니다.

누군가 설명 할 수 있습니까? 그것을 고칠 수 있습니까?

감사합니다. 모든

+2

정확하게이 유형의 쿼리가 항상 올바르게 작동합니다. 일반적으로 "모든 것을 포착"쿼리라고합니다. 이 유형의 쿼리에 대해 논의하고이를 해결할 수있는 우수 사례가 있습니다. https://www.simple-talk.com/sql/t-sql-programming/how-to-confuse-the-sql-server-query-optimizer/ –

답변

0

첫째, 쿼리에 OPTION(RECOMPILE)을 추가

SELECT col_2,col_3,col_4 
WHERE 
    (@parameter is null OR col_2 = @parameter) 
    AND col_3='2' 
    AND col_4=10.00 
OPTION(RECOMPILE); 

은 자세한 내용은 ERLAND Sommarskog에 의해 우수한 기사 Dynamic Search Conditions in T‑SQL를 참조하십시오. @parameter 만약


OPTION(RECOMPILE)와 쿼리가 효율적이되고, NULL되지 않습니다 : col_2,col_3,col_4에 인덱스가 신속하게 쿼리에 필요한 행을 찾을 수 있습니다

SELECT col_2,col_3,col_4 
WHERE 
    col_2 = <actual_parameter_value> 
    AND col_3='2' 
    AND col_4=10.00 

.

SELECT col_2,col_3,col_4 
WHERE 
    col_3='2' 
    AND col_4=10.00 

을 지금은 col_2,col_3,col_4 인덱스는 여기에 전혀 도움이 것을 분명하다 :


@parameter 경우 OPTION(RECOMPILE)와 쿼리가 효율적이되고, NULL이다. 효율성을 높이려면 col_3,col_4 include (col_2)에 두 번째 색인이 필요합니다.


반면에 서로 다른 순서의 열이있는 단일 색인은 두 경우 모두에 도움이됩니다. 따라서 col_2,col_3,col_4의 색인 대신 col_4,col_3,col_2 또는 col_3,col_4,col_2을 작성하고 색인하십시오. 색인 정의에 col_2을 맨 마지막에 넣으십시오. 두 경우 모두 효율적으로 사용할 수 있습니다 (OPTION(RECOMPILE)).