전체 텍스트 쿼리 성능 향상Improve the Performance of Full-Text Queries

다음은 전체 텍스트 쿼리 성능 향상에 도움이 될 권장 사항 목록입니다.The following is a list of recommendations that will help to improve the performance of full-text queries.

전체 텍스트 쿼리의 성능은 메모리, 디스크 속도, CPU 속도 및 컴퓨터 아키텍처와 같은 하드웨어 리소스의 영향도 받습니다.The performance of full-text queries is also influenced by hardware resources, such as memory, disk speed, CPU speed, and machine architecture.

  • ALTER INDEX REORGANIZE를 사용하여 기본 테이블의 인덱스를 조각 모음합니다.Defragment the index of the base table by using ALTER INDEX REORGANIZE.

  • ALTER FULLTEXT CATALOG REORGANIZE를 사용하여 전체 텍스트 카탈로그를 다시 구성합니다.Reorganize the full-text catalog by using ALTER FULLTEXT CATALOG REORGANIZE. 이 문을 실행하면 해당 카탈로그에 있는 전체 텍스트 인덱스의 마스터 병합이 수행되므로 성능 테스트 전에 실행해야 합니다.Make sure that you do this before performance testing because running this statement causes a master merge of the full-text indexes in that catalog.

  • 작은 열을 전체 텍스트 키 열로 선택합니다.Restrict your choice of full-text key columns to a small column. 900바이트 열이 지원되지만 전체 텍스트 인덱스에서는 비교적 작은 키 열을 사용하는 것이 좋습니다.Although a 900-byte column is supported, we recommend using a smaller key column in a full-text index. intbigint 는 최적의 성능을 제공합니다.int and bigint provide the best performance.

  • 정수 전체 텍스트 키를 사용하면 docid 매핑 테이블과의 조인이 방지됩니다.Using an integer full-text key avoids a join with the docid mapping table. 따라서 정수 전체 텍스트 키는 작업량을 줄여 쿼리 성능을 높이고 탐색 성능을 개선합니다.Therefore, an integer full-text key improves query performance by an order of magnitude and improves crawl performance. 전체 텍스트 키가 클러스터형 인덱스 키인 경우에도 또 다른 성능 이점을 얻을 수 있습니다.Additional performance benefits might result if the full-text key is also the clustered index key.

  • 여러 CONTAINS 조건자를 하나의 CONTAINS 조건자에 결합합니다.Combine multiple CONTAINS predicates into one CONTAINS predicate. SQL ServerSQL Server 에서는 CONTAINS 쿼리에 열 목록을 지정할 수 있습니다.In SQL ServerSQL Server you can specify a list of columns in the CONTAINS query.

  • 전체 텍스트 키 또는 순위 정보만 필요한 경우 CONTAINS 또는 FREETEXT를 사용하는 대신 CONTAINSTABLE 또는 FREETEXTTABLE 을 각각 사용합니다.If you only require full-text key or rank information, use CONTAINSTABLE or FREETEXTTABLE instead of CONTAINS or FREETEXT, respectively.

  • 결과를 제한하고 성능을 향상시키려면 FREETEXTTABLE 및 CONTAINSTABLE 함수의 top_n_by_rank 매개 변수를 사용합니다.To limit results and increase performance, use the top_n_by_rank parameter of the FREETEXTTABLE and CONTAINSTABLE functions. top_n_by_rank 를 사용하면 관련성이 가장 높은 항목만 회수할 수 있습니다.top_n_by_rank allows you to recall only the most relevant hits. 이 매개 변수는 비즈니스 시나리오에서 일치하는 모든 항목을 회수하지 않아도 되는 경우, 즉 전체 회수가 필요 없는 경우에만 사용합니다.Use this parameter only if your business scenario does not require recalling all possible hits (that is, it does not require total recall).

    참고

    전체 회수는 대개 법률 시나리오에 필요하지만 e-비즈니스와 같은 비즈니스 시나리오에서는 성능보다 중요하지 않을 수 있습니다.Total recall is typically necessary for legal scenarios but might be less important than performance for business scenarios such as an e-business.

  • 전체 텍스트 쿼리 계획을 검사하여 적절한 조인 계획이 선택되었는지 확인합니다.Check the full-text query plan to make sure that the appropriate join plan is chosen. 필요한 경우 조인 힌트 또는 쿼리 힌트를 사용합니다.Use a join hint or query hint if you have to. 전체 텍스트 쿼리에서 매개 변수가 사용될 경우 매개 변수의 첫 번째 값이 쿼리 계획을 결정합니다.If a parameter is used in the full-text query, the first-time value of the parameter determines the query plan. OPTIMIZE FOR 쿼리 힌트 를 사용하여 쿼리를 원하는 값으로 컴파일하도록 지정할 수 있습니다.You can use the OPTIMIZE FOR query hint to force the query to compile with the value you want. 이렇게 하면 결정적 쿼리 계획 및 향상된 성능을 실현하는 데 도움이 됩니다.This helps achieve a deterministic query plan and better performance.

  • 전체 텍스트 인덱스에 전체 텍스트 인덱스 조각이 너무 많으면 쿼리 성능이 크게 저하될 수 있습니다.Too many full-text index fragments in the full-text index, can lead to substantial degradation in query performance. 조각 수를 줄이려면 ALTER FULLTEXT CATALOG Transact-SQLTransact-SQL 문의 REORGANIZE 옵션을 사용하여 전체 텍스트 카탈로그를 다시 구성합니다.To reduce the number of fragments, reorganize the full-text catalog by using the REORGANIZE option of the ALTER FULLTEXT CATALOG Transact-SQLTransact-SQL statement. 이 문은 기본적으로 모든 조각을 비교적 큰 하나의 조각으로 병합하고 전체 텍스트 인덱스에서 사용되지 않는 항목을 모두 제거합니다.This statement essentially merges all the fragments into a single larger fragment and removes all obsolete entries from the full-text index.

  • 전체 텍스트 검색에서 CONTAINSTABLE에 지정되는 논리 연산자(AND, OR)는 SQL 조인으로 구현하거나 전체 텍스트 실행 STVF(스트리밍 테이블 반환 함수) 내에서 구현할 수 있습니다.In full-text search, logical operators specified in CONTAINSTABLE (AND, OR) can be implemented either as SQL joins or inside the full-text execution streaming table-valued functions (STVF). 일반적으로 한 가지 논리 연산자만 포함된 쿼리는 전체 텍스트 실행으로만 구현되는 데 반해 논리 연산자가 혼합되어 있는 쿼리는 SQL 조인도 포함합니다.Typically, queries with only one type of logical operators are implemented purely by full-text execution, whereas queries that mix logical operators also possess SQL joins. 전체 텍스트 실행 STVF 내 논리 연산자 구현에는 SQL 조인보다 실행 속도가 빠른 일부 특수한 인덱스 속성이 사용됩니다.Implementation of a logical operator inside the full-text execution STVF uses some special index properties that make it much faster than SQL joins. 따라서 가능하면 단일 유형의 논리 연산자만 사용하여 쿼리를 작성하는 것이 좋습니다.For this reason, we recommend that, where possible, you frame queries using only a single type of logical operator.

  • 선택적 관계 조건을 포함하는 응용 프로그램의 경우 선택적 관계 조건자와 비선택적 전체 텍스트 조건자를 사용하는 쿼리는 쿼리 최적화 프로그램을 사용하도록 작성되었을 때 최상의 성능을 발휘할 수 있습니다.For applications that contain selective-relation predications, queries that use selective relational predicates and unselective full-text predicates might perform best when they are written to use the query optimizer. 이렇게 하면 쿼리 최적화 프로그램이 효과적인 쿼리 계획을 생성하기 위해 조건자나 범위 축소 중 어느 것을 이용할지 결정할 수 있습니다.This allows the query optimizer to decide whether it can exploit predicate or range pushdown to produce an effective query plan. 이러한 방식은 관계형 데이터를 전체 텍스트 데이터로 인덱싱하는 것보다 간단하고 효율적일 때가 많습니다.This approach is simpler and often more efficient than indexing relational data as full-text data.

SQL Server 2008 전체 텍스트 검색: 내부 및 향상 내용SQL Server 2008 Full-Text Search: Internals and Enhancements

참고 항목See Also

sys.dm_fts_memory_buffers(Transact-SQL) sys.dm_fts_memory_buffers (Transact-SQL)
sys.dm_fts_memory_pools(Transact-SQL) sys.dm_fts_memory_pools (Transact-SQL)