문제

불행히도 몇 개의 바르 차르 필드에서 '%ABC%'와 같은 사용이 필요한 상당히 큰 테이블을 실행하는 쿼리가있어 사용자가 부분 이름 등을 검색 할 수 있습니다. SQL Server 2005

이 Varchar 필드에 인덱스를 추가하면 기본적으로 인덱스를 무시하고 해당 경우 전체 스캔을 수행 할 때 선택한 쿼리 성능 측면에서 도움이됩니까?

유사하게 사용할 때 성능을 향상시키는 다른 가능한 방법이 있습니까?

도움이 되었습니까?

해결책

해당 열에 전체 텍스트 검색을 추가하고 SQL Server의 전체 텍스트 쿼리 기능을 사용하는 경우에만 가능합니다.

그렇지 않으면, 색인이 도움이되지 않습니다.

다른 팁

인덱스 (ES)를 추가하여 성능 향상을 잠재적으로 볼 수 있습니다. 세부 사항에 따라 다릅니다 :)

전제 열의 총 크기는 얼마입니까? 얼마나 많은 행과 일치 할 것으로 예상됩니까? 술어와 일치하는 모든 행을 반환해야합니까, 아니면 상단 1 또는 상단 N 행만 반환해야합니까?

선택성이 높은/고유성이 높은 값을 검색하는 경우 (따라서 반환 할 행이 거의 없음), 전제 열은 전체 행 크기의 작은 부분 인 경우 인덱스가 매우 유용 할 수 있습니다. 여전히 스캔이지만 인덱스는 소스 테이블보다 페이지 당 더 많은 행에 맞습니다.

다음은 총 행 크기가 열 크기보다 훨씬 큰 예입니다.

create table t1 (v1 varchar(100), b1 varbinary(8000))
go
--add 10k rows of filler
insert t1 values ('abc123def', cast(replicate('a', 8000) as varbinary(8000)))
go 10000
--add 1 row to find
insert t1 values ('abc456def', cast(replicate('a', 8000) as varbinary(8000)))
go

set statistics io on 
go
select * from t1 where v1 like '%456%'
--shows 10001 logical reads

--create index that only contains the column(s) to search across
create index t1i1 on t1(v1)
go
select * from t1 where v1 like '%456%'
--or can force to 
--shows 37 logical reads

실제 실행 계획을 보면 엔진이 인덱스를 스캔하고 일치하는 행에서 책갈피 조회를 수행 할 수 있습니다. 또는이 계획을 자체적으로 사용하기로 결정하지 않은 경우 옵티마이 저에게 직접 지수를 사용하도록 직접 알릴 수 있습니다.

선택적인 몇 가지만 검색 할 열이 많으면 여러 인덱스를 생성하고 축소 방식을 사용할 수 있습니다. 예를 들어 먼저 선택적 인덱스에서 ID 세트 (또는 PK가 무엇이든) 결정한 다음 작은 PK 세트에 대한 필터로 선택적 열을 검색하십시오.

항상 큰 행 세트를 반환해야한다면 테이블 스캔으로 거의 확실하게 더 나을 것입니다.

따라서 가능한 최적화는 테이블 정의의 세부 사항과 데이터 선택성에 따라 다릅니다.

HTH! -아드리안

성능을 향상시킬 수있는 유일한 다른 방법은 "ABC%"를 사용하는 것입니다. 검색어 용어의 양쪽 끝에 와일드 카드를 추가하지 마십시오.이 경우 인덱스가 작동 할 수 있습니다.

검색어의 양쪽 끝에 와일드 카드가 있어야하는 요구 사항이라면 운이 좋지 않습니다 ...

마크

'%ABC%'와 마찬가지로 항상 전체 테이블 스캔을 수행합니다. 그 주위에는 방법이 없습니다.

당신은 몇 가지 대안 접근법이 있습니다. 먼저 전체 텍스트 검색,이 문제는 실제로 이런 종류의 문제를 위해 설계되었으므로 먼저 볼 것입니다.

또는 일부 상황에서는 데이터를 실수하고 대상 필드를 적절한 토큰으로 사전 처리 한 다음 이러한 가능한 검색어를 별도의 검색 테이블에 추가하는 것이 적절할 수 있습니다. 예를 들어, 내 데이터가 항상 'AAA/BBB/CCC'패턴을 포함하는 필드로 구성되고 사용자가 BBB에서 검색 한 다음 삽입/업데이트에서이를 토큰 화하고 (삭제에서 제거). 또한 응용 프로그램 코드 대신 트리거를 사용하는 경우 많이 우선의.

나는 이것이 실제로 최적의 기술이 아니며 데이터가 접근 방식과 잘 일치하는 경우에만 사용해야하며 어떤 이유로 든 전체 텍스트 검색을 사용하고 싶지 않은 경우에만 사용해야합니다 (및 Like Scan의 데이터베이스 성능은 실제로 용납 할 수없는). 또한 유지 보수 두통을 더 낮게 만들어 낼 것입니다.

해당 열에 통계를 만듭니다. SQL SREVER 2005는 문자열 검색을 최적화하여 그로부터 피해를 입을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top