T-SQL 인덱싱 서비스 SQL OpenQuery 최적화
문제
대본:
T-SQL 저장된 Proc (SQL Server Management Studio)를 사용하여 MS Indexing Service 와이 (단순화 된) 쿼리를 사용하여 텍스트 문서의 검색 일치를 반환합니다.
SELECT *
FROM openquery(
filesystem2,
'SELECT
Path, Rank, Filename
FROM
SCOPE('' "e:\test\documents" '')
WHERE
CONTAINS('' FORMSOF (INFLECTIONAL, "test" ) '')
') b
이 쿼리는 며칠 전에 제대로 작동하지 않았습니다. 완전히 입증되지는 않았지만 속성 캐시와 마스터 인덱스 간의 상호 작용은 원하는 문서를 찾을 수 있기 때문에 제대로 작동하지 않는 것 같습니다.
1) 스코프 매개 변수 제거 (즉, From Claus
2) where 절을 제거하고 (그리고 범위 기능을 그대로 유지)
따라서 만족이나 로케일만으로 원하는 문서를 "찾아"할 수는 있지만 둘 다 함께 사용하지는 않습니다.
한 가지 옵션은 카탈로그를 다시 인덱싱하는 것이지만, 현재는 최후의 수단의 옵션 일뿐입니다.
즉, 지정된 범위를 제외하기 위해 쿼리를 다시 작성하고 추가 WHER 절을 포함합니다.
SELECT *
FROM openquery(
filesystem2,
'SELECT
Path, Rank, Filename
FROM
SCOPE()
WHERE
CONTAINS('' FORMSOF (INFLECTIONAL, "test" ) '') and
Path like ''%e:\test\documents%''
') b
이 쿼리는 검색 할 때 적절한 문서를 반환합니다. 그러나 나는 Like 키워드를 사용하여 잠재적 인 성능에 대해 걱정하고있었습니다. 그래서 각 쿼리의 실행 계획을 조사했지만 정확히 동일했습니다. 두 가지 중 하나를 알려줍니다.
1) 인덱싱 서비스의 쿼리 구성 요소는 동등하게 만드는 방식으로 두 쿼리를 최적화합니다.
2) 쿼리 분석기는 DB 테이블이 참조되지 않은 경우 원격 쿼리에 대한 정확한 피드백을 제공하지 않습니다.
질문 (특별한 순서로). 누구든지 다음에 대한 통찰력이 있습니까?
1) 위의 시나리오에 설명 된 속성 캐시와 마스터 인덱스 사이의 원래 문제의 동작을 일으킬 수있는 것은 무엇입니까?
2) 실행 계획과 관련하여
a) Would the Querying Component process/optimize both queries the same?
b) Can Sql Server Management Studio provide execution plan feedback for openquery queries that do not reference any DB tables?
3) 마지막으로, 어떤 쿼리가 더 효율적이고 더 빠르며, 그 이유는 무엇입니까?
a) i.e. should I use the second one because it solves my problem?
고맙습니다!
해결책
없는 값은 문제 일 수 있습니다. 이 정확한 경우에 대해서는 확실하지 않지만 때로는 "where xxx is not null
"진정한 차이를 만들 수 있습니다.
또 다른 옵션은 때때로 열린 쿼리 후에 테이블에있는 위치를 두는 것입니다.select aaa, bbb from openquery(.....) where aaa = zzz
. (더 나은 스타일을 보려면 *대신 필요한 열을 선택하십시오.
더 효율적이거나 빠른 방법은 간단한 타이밍 프로세스로 쿼리를 래핑하고 SQL 관리 기본 메시지가 제공하는 메트릭을 사용할 수없는 경우 직접 판단해야 할 수도 있습니다.
결국, 쿼리가 작동하고 프로젝트를 위해 설정 한 표준을 깨뜨리지 않는 한 예 - 사용하십시오.