SQL Server 전체 텍스트 인덱스를 사용하도록 설정 한 후 쿼리를 느리게 업데이트


10

내 데이터베이스에 대해 실행되는 삽입, 업데이트 및 삭제 쿼리가 많은 asp.net 웹 사이트가 있습니다.

며칠 전에 테이블 중 하나의 두 열에 전체 텍스트 인덱스를 만듭니다. 그 후 웹 사이트가 해당 테이블에서 업데이트 쿼리를 실행할 때 SQL Server 프로세스의 메모리 및 디스크 사용량이 급증하고 업데이트 속도가 느려짐을 깨달았습니다. 전체 텍스트 인덱스를 만들기 전에 성능 문제없이 쿼리가 실행되었습니다.

또한 실행 계획에 전체 텍스트 인덱스 업데이트와 같은 것들이 있기 때문에 이전에는 매우 간단한 업데이트 쿼리가 복잡하다는 것을 알았습니다. 이것은 전체 텍스트를 활성화 한 후 복잡해진 새로운 실행 계획의 일부입니다.

여기에 이미지 설명을 입력하십시오

사이트 내용을 업데이트 할 때 몇 시간 동안 5000 개의 업데이트 쿼리를 실행했으며 각 행마다 전체 텍스트 인덱싱 프로세스가 수행된다고 생각합니다.

행 업데이트 시작시 전체 텍스트 스캔을 비활성화 한 다음 다시 활성화해야 합니까 ( 이 관련 질문 에서 같이 )?

SQL Server에 5 분 동안 전체 텍스트 인덱싱을 중지 한 다음 새 데이터 인덱싱을 시작하도록 지시 할 수 있습니까?

더 나은 대안이 있습니까? SQL Server 2012를 사용하고 있습니다.

답변:


2

필자의 경우 비효율적 인 UPDATE 문을 변경해야했습니다.

전에:

UPDATE Customer 
SET Rating = 'Not Rated'
WHERE ...

후:

UPDATE Customer
SET Rating = 'Not Rated'
WHERE ...
AND Rating <> 'Not Rated' -- THIS LINE WAS INSERTED

이로써 4 분에서 5 초로 성능이 향상되었습니다. 문제는 할당하려는 값이 이미 있더라도 모든 행을 업데이트하는 데 사용되었습니다.


1

중지하면 (비활성화) 인덱스를 사용하는 쿼리에 인덱스를 사용할 수 없습니다.

그러나 변경 내용 추적을 수동으로 설정할 수 있습니다.

--disable automatic change tracking
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING MANUAL
GO

--run the update statement here

--re-enable automatical change tracking after updating it to reflect the recent changes
ALTER FULLTEXT INDEX schema.table START UPDATE POPULATION
GO
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING AUTO
GO

이 쿼리로 현재 값을 확인할 수 있습니다.

SELECT TOP(10) change_tracking_state_desc, * 
FROM sys.fulltext_indexes 
WHERE object_name(object_id) = '...';

유효한 옵션은 다음과 같습니다. SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

전체 텍스트 인덱스에 포함 된 테이블 열에 대한 변경 (업데이트, 삭제 또는 삽입)이 SQL Server에서 전체 텍스트 인덱스로 전파되는지 여부를 지정합니다. 데이터를 통해 변경 WRITETEXTUPDATETEXT전체 텍스트 인덱스에 반영되지 않으며, 변경 추적에 포착되지 않습니다.

ALTER FULLTEXT INDEX (Transact-SQL)에 대한 Microsoft 설명서를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.