2011-04-26 3 views
2

나는 내가 그 쿼리를 빠르게 만들려고이쿼리가 테이블에 대해 둘 이상의 비 클러스터형 인덱스를 사용할 수 있습니까?

SELECT TOP 1000 C.iId_company 
FROM dbo.Company AS C WITH(NOLOCK) 
WHERE 
C.col_1 LIKE 'something%' 
OR C.col_1 LIKE 'something2%' 
OR C.col_1 LIKE 'something3%' 
OR C.col_2 LIKE 'something%' 
OR C.col_2 LIKE 'something2%' 
OR C.col_2 LIKE 'something3%' 

과 같은 쿼리를 가지고 있고, 나는 컬럼 col_1 및 col_2에는에 인덱스를 추가했습니다. col_2에 관한 조건을 주석으로 처리하면 쿼리는 매우 빠르며 col_1 (col_1에 대한 조건을 주석으로 처리하는 경우)과 동일합니다. 그러나 내가 그렇게 그것을 떠날 때, 그것은 매우 오래된 느린 이야기입니다.

실행 계획을 살펴본 결과 의심되는 점은 한 번에 하나의 인덱스 만 사용되고 SQL은 첫 번째 인덱스가 사용 된 후 SQL에서 하위 집합 스캔을 수행한다는 것입니다. 나는 다른 것들을 시도했다. (두 컬럼의 인덱스를 만들지 만 또한 작동하지 않는다.)

실제로 유일한 해결책은 쿼리를 분할하고 UNION을 사용하는 것이다. 그런 종류의 쿼리를 더 빠르게 만들고 한 쿼리에서 유지할 수있는 방법이 있습니까?

+0

'OPTION (FORCESEEK) '힌트를 사용하면 어떨까요? 그렇다면 그것은 인덱스 조합을 수행합니까? –

+0

@Martin이 경우 두 열 모두에서 색인을 생성 할 수 없습니까? – rsbarro

+0

@rsbarro. 그것들이 복합 인덱스'col1, col2' 또는'col2, col1'을 생성한다면'col_1 LIKE 'something %'또는'col_2 LIKE 'something %''에 대해서만 탐색 될 것입니다. 다른 'OR'표준을 결정하기 위해 여전히 전체 색인을 스캔해야합니다. –

답변

2

공용체를 사용하십시오. 즉 :

SELECT TOP 1000 C.iId_company 
FROM dbo.Company AS C WITH(NOLOCK) 
WHERE 
C.col_1 LIKE 'something%' 
OR C.col_1 LIKE 'something2%' 
OR C.col_1 LIKE 'something3%' 

union all 

SELECT TOP 1000 C.iId_company 
FROM dbo.Company AS C WITH(NOLOCK) 
WHERE 
C.col_2 LIKE 'something%' 
OR C.col_2 LIKE 'something2%' 
OR C.col_2 LIKE 'something3%' 

필요에 따라 조정 (예를 들어, 당신은 당신이 최고 1,000로 간주 무엇이든 얻을 order by 절을 추가 할 수 있도록 선택에 그 모든 일을 마무리해야 할 수도 있습니다). 그러나 나는이 솔루션에 만족할 것이라고 생각합니다.

+0

UNION ALL을 사용하여 두 결과 집합을 연결하면 중복 행이 생길 수 있으므로이 조합에서 궁극적으로 선택하는 표현식은 SELECT DISTINCT를 발행하거나 위의 쿼리가 UNION을 사용하여 해당 수준에서 정렬을 수행 할 수 있습니다. –

+0

그것이 내가 피하려고했던 것입니다. 이미 해당 쿼리를 생성 할 수있었습니다. (내 마지막 질문에) – MaxiWheat

+0

@Fred : 네 말이 맞아. 세트에서 상위 1000 개를 얻는 것이 노조 안에서 뚜렷한 일을하는 것보다 노조를 선택하는 것에서 조금 더 효율적으로 수행 될 것입니다. –

0

요구 사항에 따라 검색중인 각 열에 하나씩 두 개의 별도 인덱스가 필요하다는 것이 지적되었습니다. 쿼리에 대한 Explain 계획을 생성하고 보려면 원하는 DBA 도구를 사용하십시오. 이제 Explain 플랜이 이전 시도보다 개선되었는지보기 위해 쿼리를 다시 시작할 수 있습니다. UNION 또는 공통 테이블 표현식을 사용하여 두 개의 u 리를 함게 하나의 결과 세트로 결합해야 할 수도 있습니다.

관련 문제