전체 텍스트 인덱스 성능 향상Improve the Performance of Full-Text Indexes

이 항목에서는 전체 텍스트 인덱스 및 쿼리 성능 저하의 몇 가지 일반적인 원인에 대해 설명합니다.This topic describes some of the common causes of poor performance for full-text indexes and queries. 또한 이러한 문제를 완화하고 성능을 향상시킬 수 있는 몇 가지 제안 사항도 제공합니다.It also provides a few suggestions to mitigate these issues and improve performance.

Common causes of performance issues Common causes of performance issues

하드웨어 리소스 문제Hardware resource issues

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

전체 텍스트 인덱싱 성능이 저하되는 주요 원인으로는 다음과 같은 하드웨어 리소스 제한을 들 수 있습니다.The main cause for reduced full-text indexing performance is hardware-resource limits.

  • CPU.CPU. 필터 데몬 호스트 프로세스(fdhost.exe) 또는 SQL ServerSQL Server 프로세스(sqlservr.exe)에 의한 CPU 사용률이 100%에 가까운 경우 CPU는 병목 상태입니다.If CPU usage by the filter daemon host process (fdhost.exe) or the SQL ServerSQL Server process (sqlservr.exe) is close to 100 percent, the CPU is the bottleneck.

  • 메모리.Memory. 실제 메모리가 부족할 경우 메모리 병목 상태가 발생할 수 있습니다.If there is a shortage of physical memory, memory might be the bottleneck.

  • 디스크.Disk. 평균 디스크 대기 큐 길이가 디스크 헤드 수보다 두 배 이상 많은 경우 디스크에 병목 상태가 존재합니다.If the average disk-waiting queue length is more than two times the number of disk heads, there is a bottleneck on the disk. 기본적인 해결 방법은 SQL ServerSQL Server 데이터베이스 파일 및 로그와 별개인 전체 텍스트 카탈로그를 만드는 것입니다.The primary workaround is to create full-text catalogs that are separate from the SQL ServerSQL Server database files and logs. 로그, 데이터베이스 파일 및 전체 텍스트 카탈로그를 서로 다른 디스크에 저장합니다.Put the logs, database files, and full-text catalogs on separate disks. 또한 더 빠른 디스크를 설치하고 RAID를 사용하면 인덱싱 성능을 향상시키는 데 도움이 될 수 있습니다.Installing faster disks and using RAID can also help improve indexing performance.

    참고

    SQL Server 2008SQL Server 2008부터는 전체 텍스트 엔진이 sqlservr.exe 프로세스에 속하기 때문에 AWE 메모리가 사용됩니다.Beginning in SQL Server 2008SQL Server 2008, the Full-Text Engine can use AWE memory because the Full-Text Engine is part of the sqlservr.exe process.

전체 텍스트 일괄 처리 문제Full-text batching issues

시스템에 하드웨어 병목 상태가 존재하지 않을 경우 전체 텍스트 검색의 인덱싱 성능은 주로 다음 사항에 따라 달라집니다.If the system has no hardware bottlenecks, the indexing performance of full-text search mostly depends on the following:

  • SQL ServerSQL Server 에서 전체 텍스트 일괄 처리를 만드는 데 걸리는 시간How long it takes SQL ServerSQL Server to create full-text batches.

  • 필터 데몬에서 이러한 일괄 처리를 완료할 수 있는 시간How quickly the filter daemon can consume those batches.

전체 텍스트 인덱스 채우기 문제Full-text index population issues

  • 채우기 유형.Type of population. 전체 채우기와 달리 증분, 수동 및 자동 변경 내용 추적 채우기는 하드웨어 리소스를 극대화하여 더 빠른 속도를 낼 수 없습니다.Unlike full population, incremental, manual, and auto change tracking population are not designed to maximize hardware resources to achieve faster speed. 따라서 이 항목의 튜닝 제안이 증분, 수동 또는 자동 변경 내용 추적 채우기를 사용하는 경우 전체 텍스트 인덱싱 성능을 향상시키지 않을 수 있습니다.Therefore, the tuning suggestions in this topic may not enhance performance for full-text indexing when it uses incremental, manual, or auto change tracking population.

  • 마스터 병합.Master merge. 채우기가 완료되면 인덱스 조각을 하나의 마스터 전체 텍스트 인덱스로 병합하는 최종 병합 프로세스가 실행됩니다.When a population has completed, a final merge process is triggered that merges the index fragments together into one master full-text index. 이렇게 하면 많은 인덱스 조각 대신 마스터 인덱스만 쿼리하면 되기 때문에 쿼리 성능이 향상되며 개선된 평가 통계를 사용하여 관련성 등급을 지정할 수 있습니다.This results in improved query performance since only the master index needs to be queried rather than a number of index fragments, and better scoring statistics may be used for relevance ranking. 그러나 인덱스 조각을 병합할 때 많은 양의 데이터를 읽고 써야 하기 때문에 마스터 병합에 많은 I/O 사용량이 필요할 수 있지만 이로 인해 들어오는 쿼리가 차단되지는 않습니다.However the master merge can be I/O intensive, because large amounts of data must be written and read when index fragments are merged, though it does not block incoming queries.

    많은 양의 데이터를 마스터 병합하면 장기 실행 트랜잭션이 생성될 수 있으며 이로 인해 검사점이 사용되는 동안 트랜잭션 로그의 잘림이 지연될 수 있습니다.Master merging a large amount of data can create a long running transaction, delaying truncation of the transaction log during checkpoint. 이 경우 전체 복구 모델에서 트랜잭션 로그의 크기가 대폭 증가할 수 있습니다.In this case, under the full recovery model, the transaction log might grow significantly. 전체 복구 모델이 사용되는 데이터베이스에서 큰 전체 텍스트 인덱스를 다시 구성하기 전에 장기 실행 트랜잭션에 대비하여 트랜잭션 로그에 충분한 공간을 확보하는 것이 가장 좋은 방법입니다.As a best practice, before reorganizing a large full-text index in a database that uses the full recovery model, ensure that your transaction log contains sufficient space for a long-running transaction. 자세한 내용은 트랜잭션 로그 파일의 크기 관리를 참조하세요.For more information, see Manage the Size of the Transaction Log File.

전체 텍스트 인덱스 성능 향상 Tune the performance of full-text indexes

전체 텍스트 인덱스의 성능을 극대화하려면 다음과 같은 방법을 구현하는 것이 가장 좋습니다.To maximize the performance of your full-text indexes, implement the following best practices:

  • 모든 CPU 프로세서 또는 코어를 최대로 활용하려면 sp_configure 'max full-text crawl range'를 시스템의 CPU 개수로 설정합니다.To use all CPU processors or cores to the maximum, set sp_configure 'max full-text crawl range' to the number of CPUs on the system. 이 구성 옵션에 대한 자세한 내용은 max full-text crawl range 서버 구성 옵션을 참조하세요.For information about this configuration option, see max full-text crawl range Server Configuration Option.

  • 기본 테이블에 클러스터형 인덱스가 있는지 확인합니다.Make sure that the base table has a clustered index. 클러스터형 인덱스의 첫 번째 열에 정수 데이터 형식을 사용합니다.Use an integer data type for the first column of the clustered index. 클러스터형 인덱스의 첫 번째 열에 GUID를 사용하지 않아야 합니다.Avoid using GUIDs in the first column of the clustered index. 클러스터형 인덱스에 다중 범위 채우기가 있을 경우 채우기 속도가 가장 빨라질 수 있습니다.A multi-range population on a clustered index can produce the highest population speed. 전체 텍스트 키로 사용하는 열을 정수 데이터 형식으로 설정하는 것이 좋습니다.We recommend that the column serving as the full-text key be an integer data type.

  • UPDATE STATISTICS 문을 사용하여 기본 테이블의 통계를 업데이트합니다.Update the statistics of the base table by using the UPDATE STATISTICS statement. 더욱 중요한 것은 전체 채우기에 대한 클러스터형 인덱스 또는 전체 텍스트 키의 통계를 업데이트하는 것입니다.More important, update the statistics on the clustered index or the full-text key for a full population. 이렇게 하면 다중 범위 채우기에서 테이블에 적절한 파티션을 생성하는 데 도움이 됩니다.This helps a multi-range population to generate good partitions on the table.

  • 대형 다중 CPU 컴퓨터에 대해 전체 채우기를 수행하려면 fdhost.exe 프로세스 및 운영 체제 용도로 메모리를 충분히 남기도록 max server memory 값을 설정하여 버퍼 풀 크기를 임시로 제한하는 것이 좋습니다.Before you perform a full population on a large multi-CPU computer, we recommend that you temporarily limit the size of the buffer pool by setting the max server memory value to leave enough memory for the fdhost.exe process and operating system use. 자세한 내용은 이 항목 후반에 나오는 "필터 데몬 호스트 프로세스(fdhost.exe)의 메모리 요구 사항 예상"을 참조하십시오.For more information, see "Estimating the Memory Requirements of the Filter Daemon Host Process (fdhost.exe)," later in this topic.

  • 타임스탬프 열 기반의 증분 채우기를 사용할 경우 증분 채우기의 성능을 향상시키려면 timestamp 열에 보조 인덱스를 빌드합니다.If you use incremental population based on a timestamp column, build a secondary index on the timestamp column to improve the performance of incremental population.

전체 채우기 성능 문제 해결 Troubleshoot the performance of full populations

전체 텍스트 크롤링 로그 검토Review the full-text crawl logs

성능 문제를 진단하려면 전체 텍스트 탐색 로그를 검토합니다.To help diagnose performance problems, look at the full-text crawl logs.

탐색 중에 오류가 발생하면 전체 텍스트 검색 탐색 로깅 기능은 일반 텍스트 파일인 탐색 로그를 만들고 유지 관리합니다.When an error occurs during a crawl, the Full-Text Search crawl logging facility creates and maintains a crawl log, which is a plain text file. 각 탐색 로그는 특정 전체 텍스트 카탈로그에 해당합니다.Each crawl log corresponds to a particular full-text catalog. 기본적으로 지정된 인스턴스(이 예제에서는 기본 인스턴스)에 대한 크롤링 로그는 %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG 폴더에 있습니다.By default, crawl logs for a given instance (in this example, the default instance) are located in %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG folder.

탐색 로그 파일은 다음 명명 구성표를 따릅니다.The crawl log file follows the following naming scheme:

SQLFT<DatabaseID\><FullTextCatalogID\>.LOG[<n\>]

크롤링 로그 파일 이름의 변수 부분은 다음과 같습니다.The variable parts of the crawl log file name are the following.

  • <DatabaseID> - 데이터베이스의 ID입니다.<DatabaseID> - The ID of a database. <dbid>는 앞에 오는 0을 사용하는 5자리 숫자입니다. <dbid> is a five digit number with leading zeros.
  • <FullTextCatalogID> - 전체 텍스트 카탈로그 ID입니다.<FullTextCatalogID> - Full-text catalog ID. <catid>는 앞에 오는 0을 사용하는 5자리 숫자입니다. <catid> is a five digit number with leading zeros.
  • <n> - 동일한 전체 텍스트 카탈로그의 탐색 로그가 하나 이상 있음을 나타내는 정수입니다.<n> - Is an integer that indicates one or more crawl logs of the same full-text catalog exist.

    예를 들어 SQLFT0000500008.2는 데이터베이스 ID = 5, 전체 텍스트 카탈로그 ID = 8인 데이터베이스의 탐색 로그 파일입니다.For example, SQLFT0000500008.2 is the crawl log file for a database with database ID = 5, and full-text catalog ID = 8. 파일 이름 끝에 있는 2는 이 데이터베이스/카탈로그 쌍의 탐색 로그 파일이 두 개 있음을 나타냅니다.The 2 at the end of the file name indicates that there are two crawl log files for this database/catalog pair.

실제 메모리 사용률 확인Check physical memory usage

전체 텍스트 채우기를 수행하는 동안 fdhost.exe 또는 sqlservr.exe의 메모리가 부족하거나 아예 없을 수 있습니다.During a full-text population, it is possible for fdhost.exe or sqlservr.exe to run low on memory or to run out of memory.

  • 전체 텍스트 탐색 로그에 fdhost.exe가 자주 다시 시작되는 것으로 나타나거나 오류 코드 8007008이 반환된 것으로 나타날 경우 이러한 프로세스 중 하나에 메모리 부족 문제가 발생한 것입니다.If the full-text crawl log shows that fdhost.exe is being restarted often or that error code 8007008 is being returned it means one of these processes is running out of memory.
  • fdhost.exe가 특히 대형 다중 CPU 컴퓨터에서 덤프를 생성하는 경우 이는 메모리 부족 때문일 수 있습니다.If fdhost.exe is producing dumps, particularly on large, multi-CPU computers, it might be running out of memory.
  • 전체 텍스트 탐색에 사용되는 메모리 버퍼에 대한 자세한 내용은 sys.dm_fts_memory_buffers(Transact-SQL)를 참조하세요.To get information about memory buffers used by a full-text crawl, see sys.dm_fts_memory_buffers (Transact-SQL).

    메모리 부족 문제의 원인은 다음과 같습니다.The possible causes of low memory or out of memory issues are the following:

  • 메모리 부족.Insufficient memory. 전체 채우기 과정 중에 사용할 수 있는 실제 메모리 양이 0바이트인 경우 SQL ServerSQL Server 버퍼 풀이 시스템의 실제 메모리를 대부분 사용 중일 수 있습니다.If the amount of physical memory that is available during a full population is zero, the SQL ServerSQL Server buffer pool might be consuming most of the physical memory on the system.

    sqlservr.exe 프로세스는 버퍼 풀에 가능한 메모리를 구성된 최대 서버 메모리까지 모두 사용하려고 합니다.The sqlservr.exe process tries to grab all available memory for the buffer pool, up to the configured maximum server memory. max server memory 에 할당된 양이 너무 많은 경우 메모리가 부족해져 fdhost.exe 프로세스에 공유 메모리를 할당하지 못하게 될 수 있습니다.If the max server memory allocation is too large, out-of-memory conditions and failure to allocate shared memory can occur for the fdhost.exe process.

    버퍼 풀의 max server memory SQL ServerSQL Server 값을 적절히 설정하면 이 문제를 해결할 수 있습니다.You can solve this problem by setting the max server memory value of the SQL ServerSQL Server buffer pool appropriately. 자세한 내용은 이 항목 후반에 나오는 "필터 데몬 호스트 프로세스(fdhost.exe)의 메모리 요구 사항 예상"을 참조하십시오.For more information, see "Estimating the Memory Requirements of the Filter Daemon Host Process (fdhost.exe)," later in this topic. 전체 텍스트 인덱싱에 사용되는 일괄 처리 크기를 줄여도 도움이 됩니다.Reducing the batch size used for full-text indexing may also help.

  • 메모리 경합.Memory contention. 다중 CPU 컴퓨터에서 전체 텍스트 채우기를 수행하는 과정에서 fdhost.exe와 sqlservr.exe 사이에 버퍼 풀 메모리를 위한 경합이 발생할 수 있습니다.During a full-text population on a multi-CPU computer, contention for the buffer pool memory can occur between fdhost.exe or sqlservr.exe. 이로 인한 공유 메모리 부족으로 일괄 처리가 다시 시도되고, 메모리 스레시가 발생하며, fdhost.exe 프로세스에서 덤프가 생성됩니다.The resulting lack of shared memory causes batch retries, memory thrashing, and dumps by the fdhost.exe process.

  • 페이징 문제.Paging issues. 페이지 파일 크기가 충분하지 않은 경우(예: 증가가 제한된 소형 페이지 파일이 있는 시스템에서)에도 fdhost.exe 또는 sqlservr.exe 실행 시 메모리 부족이 발생할 수 있습니다.Insufficient page-file size, such as on a system that has a small page file with restricted growth, can also cause the fdhost.exe or sqlservr.exe to run out of memory. 탐색 로그에 메모리 관련 오류가 표시되지 않은 경우 과도한 페이징으로 인한 성능 저하 상태일 수 있습니다.If the crawl logs do not indicate any memory-related failures, it is likely that performance is slow due to excessive paging.

필터 데몬 호스트 프로세스(fdhost.exe)의 메모리 요구 사항 예상Estimate the memory requirements of the Filter Daemon Host process (fdhost.exe)

채우기용으로 fdhost.exe 프로세스에서 필요로 하는 메모리 양은 사용되는 전체 텍스트 탐색 범위 수, ISM(인바운드 공유 메모리) 크기, 최대 ISM 인스턴스 수 등에 따라 다릅니다.The amount of memory required by the fdhost.exe process for a population depends mainly on the number of full-text crawl ranges it uses, the size of inbound shared memory (ISM), and the maximum number of ISM instances.

필터 데몬 호스트에서 사용되는 메모리(바이트)는 다음 수식을 사용하여 대략적으로 계산할 수 있습니다.The amount of memory (in bytes) consumed by the filter daemon host can be roughly estimated by using the following formula:

number_of_crawl_ranges * ism_size * max_outstanding_isms * 2

이 수식에서 변수 기본값은 다음과 같습니다.The default values of the variables in the preceding formula are as follows:

변수Variable 기본값Default value
number_of_crawl_rangesnumber_of_crawl_ranges CPU 수The number of CPUs
ism_sizeism_size x86 컴퓨터의 경우 1MB1 MB for x86 computers

x64 컴퓨터의 경우 4MB, 8MB 또는 16MB(총 실제 메모리에 따라 다름)4 MB, 8 MB, or 16MB for x64 computers, depending on the total physical memory
max_outstanding_ismsmax_outstanding_isms x86 컴퓨터의 경우 2525 for x86 computers

x64 컴퓨터의 경우 55 for x64 computers

다음 표에서는 fdhost.exe의 메모리 요구 사항을 계산하는 방법에 대한 지침을 제공합니다.The following table presents guidelines about how to estimate the memory requirements of fdhost.exe. 이 표의 수식에 사용되는 값은 다음과 같습니다.The formulas in this table use the following values:

  • F는 fdhost.exe에 필요한 예상 메모리(MB)입니다.F, which is an estimate of memory needed by fdhost.exe (in MB).

  • T는 시스템에서 사용 가능한 실제 총 메모리(MB)입니다.T, which is the total physical memory available on the system (in MB).

  • M,(최적의 max server memory 설정)M, which is the optimal max server memory setting.

다음 수식에 대한 자세한 내용은 표 다음에 나오는 참고 사항을 참조하세요.For essential information about the following formulas, see the notes that follow the table.

플랫폼Platform fdhost.exe에 필요한 예상 메모리(MB) -F^1Estimating fdhost.exe memory requirements in MB—F^1 max server memory 계산 수식 -M^2Formula for calculating max server memory—M^2
x86x86 F = 탐색 범위 수 * 50F = Number of crawl ranges * 50 M =minimum(T, 2000) – F – 500M =minimum(T, 2000) – F – 500
x64x64 F = 탐색 범위 수 * 10 * 8F = Number of crawl ranges * 10 * 8 M = TF – 500M = TF – 500

수식 관련 참고 사항Notes about the formulas

  1. 여러 전체 채우기가 진행 중인 경우 F1, F2와 같이 각 채우기 작업에 대한 fdhost.exe 메모리 요구 사항을 개별적으로 계산합니다.If multiple full populations are in progress, calculate the fdhost.exe memory requirements of each separately, as F1, F2, and so forth. 그런 다음 MT sigma(Fi)로 계산합니다.Then calculate M as T sigma(Fi).
  2. 500MB는 시스템의 다른 프로세스에 필요한 예상 메모리 양입니다.500 MB is an estimate of the memory required by other processes in the system. 시스템이 추가 작업을 수행 중인 경우 그에 따라 이 값을 늘리십시오.If the system is doing additional work, increase this value accordingly.
  3. 를 참조하세요.ism_size 는 x64 플랫폼의 경우 8MB로 가정합니다..ism_size is assumed to be 8 MB for x64 platforms.

    예제: fdhost.exe에 필요한 예상 메모리Example: Estimate the memory requirements of fdhost.exe

    이 예제는 8GB RAM과 4개의 듀얼 코어 프로세서가 장착된 64비트 컴퓨터에 해당합니다.This example is for an 64-bit computer that has 8GM of RAM and 4 dual core processors. 첫 번째 계산에서는 fdhost.exe에 필요한 메모리인F를 계산합니다.The first calculation estimates of memory needed by fdhost.exe—F. 탐색 범위 수는 8입니다.The number of crawl ranges is 8.

    F = 8*10*8=640

    다음 계산에서는 max server memory에 대한 최적 값인M을 구합니다.The next calculation obtains the optimal value for max server memoryM. 시스템에서 사용 가능한 실제 총 메모리(MB)(T)는 8192입니다.The total physical memory available on this system in MB—T—is 8192.

    M = 8192-640-500=7052

    예: 최대 서버 메모리 설정Example: Setting max server memory

    이 예에서는 sp_configureRECONFIGURE Transact-SQLTransact-SQL 문을 사용하여 max server memory 를 위의 예에서 M 에 대한 계산한 값 7052로 설정합니다.This example uses the sp_configure and RECONFIGURE Transact-SQLTransact-SQL statements to set max server memory to the value calculated for M in the preceding example, 7052:

USE master;  
GO  
EXEC sp_configure 'max server memory', 7052;  
GO  
RECONFIGURE;  
GO  

서버 메모리 옵션에 대한 자세한 내용은 서버 메모리 서버 구성 옵션을 참조하세요.For more info about the server memory options, see Server Memory Server Configuration Options.

CPU 사용량 확인Check CPU usage

평균 CPU 사용량이 30% 미만이면 전체 채우기 성능이 최적의 상태가 아닙니다.The performance of full populations is not optimal when the average CPU consumption is lower than about 30 percent. CPU 사용량에 영향을 주는 몇 가지 요소는 다음과 같습니다.Here are some factors that affect CPU consumption.

  • 긴 페이지 대기 시간High wait time for pages

    페이지 대기 시간이 긴지 확인하려면 다음 Transact-SQLTransact-SQL 문을 실행합니다.To find out whether a page wait time is high, run the following Transact-SQLTransact-SQL statement:

    Execute SELECT TOP 10 * FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC;  
    

    다음 표에서는 몇 가지 흥미로운 대기 유형을 설명합니다.The following table describes the wait types of interest here.

    대기 유형Wait type 설명Description 가능한 해결 방법Possible resolution
    PAGEIO_LATCH_SH(_EX 또는 _UP)PAGEIO_LATCH_SH (_EX or _UP) IO 병목 상태를 나타내며, 이 경우 일반적으로 평균 디스크 큐 길이가 깁니다.This could indicate an IO bottleneck, in which case you would typically also see a high average disk-queue length. 전체 텍스트 인덱스를 다른 디스크의 다른 파일 그룹으로 이동하면 IO 병목 상태가 줄어들 수 있습니다.Moving the full-text index to a different filegroup on a different disk could help reduce the IO bottleneck.
    PAGELATCH_EX(또는 _UP)PAGELATCH_EX (or _UP) 동일한 데이터베이스 파일에 쓰기를 시도하고 있는 스레드 간에 경합이 많이 발생하고 있음을 나타냅니다.This could indicate a lot of contention among threads that are trying to write to the same database file. 전체 텍스트 인덱스가 상주하는 파일 그룹에 파일을 추가하면 이러한 경합을 완화할 수 있습니다.Adding files to the filegroup on which the fulltext index resides could help alleviate such contention.

    자세한 내용은 sys.dm_os_wait_stats(Transact-SQL)를 참조하세요.For more info, see sys.dm_os_wait_stats (Transact-SQL).

  • 비효율적인 기본 테이블 검색Inefficiencies in scanning the base table

    전체 채우기는 기본 테이블을 검색하여 일괄 처리를 생성합니다.A full population scans the base table to produce batches. 이러한 테이블 검색은 다음과 같은 경우 비효율적일 수 있습니다.This table scanning could be inefficient in the following scenarios:

    • 기본 테이블에 전체 텍스트 인덱싱을 수행 중인 행 외부 열의 비율이 높을 경우 일괄 처리를 생성하기 위해 기본 테이블을 검색하면 병목 상태가 발생할 수 있습니다.If the base table has a high percentage of out-of-row columns that are being full-text indexed, scanning the base table to produce batches might be the bottleneck. 이 경우에는 varchar(max) 또는 nvarchar(max) 를 사용하여 비교적 작은 행 내부 데이터를 이동하는 것이 좋습니다.In this case, moving the smaller data in-row using varchar(max) or nvarchar(max) might help.

    • 기본 테이블이 심하게 조각화된 경우 검색이 비효율적일 수 있습니다.If the base table is very fragmented, scanning might be inefficient. 행 외부 데이터 및 인덱스 조각화를 계산하는 방법은 sys.dm_db_partition_stats(Transact-SQL)sys.dm_db_index_physical_stats(Transact-SQL)를 참조하세요.For information about computing out-of-row data and index fragmentation, see sys.dm_db_partition_stats (Transact-SQL) and sys.dm_db_index_physical_stats (Transact-SQL).

      조각화를 완화하기 위해 클러스터형 인덱스를 다시 구성하거나 다시 작성할 수 있습니다.To reduce fragmentation, you can reorganize or rebuild the clustered index. 자세한 내용은 인덱스 다시 구성 및 다시 작성을 참조하세요.For more information, see Reorganize and Rebuild Indexes.

문서의 느린 인덱싱 문제 해결 Troubleshoot slow indexing of documents

참고

이 섹션에서는 다른 문서 유형이 포함된 문서(예: Microsoft Word 문서)를 인덱싱하는 고객에게만 적용되는 문제에 대해 설명합니다.This section describes an issue that only affects customers who index documents (such as Microsoft Word documents) in which other document types are embedded.

전체 텍스트 엔진은 전체 텍스트 인덱스를 채울 때 다중 스레드 필터 및 단일 스레드 필터라는 두 가지 필터 유형을 사용합니다.The Full-Text Engine uses two types of filters when it populates a full-text index: multithreaded filters and single-threaded filters.

  • MicrosoftMicrosoft Word 문서와 같은 일부 문서는 다중 스레드 필터를 사용하여 필터링됩니다.Some documents, such as MicrosoftMicrosoft Word documents, are filtered using a multithreaded filter.
  • 그러나 Adobe Acrobat PDF(Portable Document Format) 문서와 같은 다른 문서는 단일 스레드 필터를 사용하여 필터링됩니다.Other documents, such as Adobe Acrobat Portable Document Format (PDF) documents, are filtered using a single-threaded filter.

    보안상의 이유로 필터는 필터 데몬 호스트 프로세스에 의해 로드됩니다.For security reasons, filters are loaded by the filter daemon host processes. 서버 인스턴스는 모든 다중 스레드 필터에 대해 다중 스레드 프로세스를 사용하고 모든 단일 스레드 필터에 대해 단일 스레드 프로세스를 사용합니다.A server instance uses a multithreaded process for all multithreaded filters and a single-threaded process for all single-threaded filters. 다중 스레드 필터를 사용하는 문서에 단일 스레드 필터를 사용하는 포함 문서가 있을 경우 전체 텍스트 엔진은 해당 포함 문서에 대해 단일 스레드 프로세스를 시작합니다.When a document that uses a multithreaded filter contains an embedded document that uses a single-threaded filter, the Full-Text Engine launches a single-threaded process for the embedded document. 예를 들어 PDF 문서가 포함된 Word 문서가 있을 경우 전체 텍스트 엔진은 Word 콘텐츠에 대해 다중 스레드 프로세스를 사용하고 PDF 콘텐츠에 대해 단일 스레드 프로세스를 시작합니다.For example, on encountering a Word document that contains a PDF document, the Full-Text Engine uses the multithreaded process for the Word content and launches a single-threaded process for the PDF content. 그러나 이러한 환경에서는 단일 스레드 필터가 제대로 작동하지 않을 수 있으며 이로 인해 필터링 프로세스가 불안정해질 수 있습니다.A single-threaded filter might not work well in this environment, however, and could destabilize the filtering process. 이러한 포함 작업이 자주 수행되는 특정 환경에서는 불안정화로 인해 해당 프로세스가 충돌할 수 있습니다.In certain circumstances where such embedding is common, destabilization might lead to crashes of the process. 충돌이 발생하면 전체 텍스트 엔진은 실패한 문서(예: 포함된 PDF 콘텐츠가 있는 Word 문서)를 단일 스레드 필터링 프로세스로 모두 다시 라우트합니다.When this occurs, the Full-Text Engine re-routes any failed document - for example, a Word document that contains embedded PDF content - to the single-threaded filtering process. 다시 라우팅 작업이 자주 발생하면 전체 텍스트 인덱싱 프로세스의 성능이 저하됩니다.If re-routing occurs frequently, it results in performance degradation of the full-text indexing process.

이 문제를 해결하려면 컨테이너 문서(이 예제의 경우 Word 문서)의 필터를 단일 스레드 필터로 표시합니다.To work around this problem, mark the filter for the container document (the Word document, in this example) as a single-threaded filter. 필터를 단일 스레드 필터로 표시하려면 필터의 ThreadingModel 레지스트리 값을 Apartment Threaded로 설정합니다.To mark a filter as a single-threaded filter, set the ThreadingModel registry value for the filter to Apartment Threaded. 단일 스레드 아파트에 대한 자세한 내용은 COM 스레딩 모델 이해 및 사용백서를 참조하세요.For information about single-threaded apartments, see the white paper Understanding and Using COM Threading Models.

참고 항목See Also

서버 메모리 서버 구성 옵션 Server Memory Server Configuration Options
max full-text crawl range 서버 구성 옵션 max full-text crawl range Server Configuration Option
전체 텍스트 인덱스 채우기 Populate Full-Text Indexes
전체 텍스트 인덱스 만들기 및 관리 Create and Manage Full-Text Indexes
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)
전체 텍스트 인덱싱 문제 해결Troubleshoot Full-Text Indexing