SQL Server 2008 전체 텍스트 인덱스가 완료된 것으로 보이지 않음


13

당사 웹 사이트에는 웹 사이트 검색을위한 전체 텍스트 인덱싱 기능이있는 SQL Server 2008 R2 Express Edition 데이터베이스가 있습니다. 인덱싱 된 테이블 중 하나에서 새 레코드가 추가되거나 업데이트 될 때마다 인덱싱 프로세스가 완료되지 않는 것 같습니다.

지난 몇 주 동안이 사이트에서 찾은 기본적으로 동일한 쿼리를 사용하여 상태를 모니터링하고 있습니다 : http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-search/2155/Why-is-this -인구 너무 오래

이것은 쿼리를 실행할 때 표시되는 것입니다 (전체 크기를 보려면 클릭하십시오). 전체 텍스트 색인 상태

인덱싱 된 테이블의 최신 레코드는 절대 완료되지 않으며 검색 할 수 없습니다. 테이블에 많은 데이터가 없지만 인덱싱이 완료되는지 확인하기 위해 며칠을 기다렸지 만 아무것도 바뀌지 않았습니다.

인덱싱을 성공적으로 완료 할 수있는 유일한 방법은 카탈로그를 다시 작성하거나 모든 인덱스를 삭제하고 다시 만드는 것입니다.

내가 할 때마다 첫 번째 새 레코드가 추가되는 즉시 동일한 문제가 다시 발생합니다.

다음과 같은 경우에 대비하여 서버 통계는 다음과 같습니다.

  • 쿼드 코어 AMD Opteron 2.34GHz
  • 4GB RAM
  • Windows Server 2008 R2 Enterprise SP1 x64
  • Advanced Services x64가 포함 된 SQL Server 2008 R2 Express Edition

답변:


6

마침내 내 문제의 원인을 찾았습니다!

나는 몇 달 동안 문제를 추적하려고 시도했지만 마침내 자동 변경 추적을 비활성화하고 수동으로 증분 인구를 시작하고 내 인생을 계속했습니다.

한편, 추적하는 데 문제가있는 또 다른 잔소리 오류가있었습니다. 주기적으로 웹 사이트에서 DB 연결 오류가 발생합니다.

로그인이 요청한 "XXXX"데이터베이스를 열 수 없습니다. 로그인이 실패했습니다. 사용자 'XXXX'의 로그인에 실패했습니다.

이 두 문제는 모두 같은 해결책을 가지고있었습니다. 내가해야 할 일은 자동 닫기라는 데이터베이스 설정을 끄는 것입니다. 이를 수행하려면 데이터베이스를 마우스 오른쪽 단추로 클릭하고 특성을 클릭하십시오. 속성 창에서 옵션을 선택하고 "자동 닫기"를 false로 설정하십시오.

데이터베이스 속성 창

자동 닫기를 비활성화하자마자 DB 로그인 문제가 사라지고 자동 변경 추적이 완벽하게 작동했습니다.

모두의 도움에 다시 한번 감사드립니다. 감사합니다!


3

전체 텍스트 성능에 대한 BOL의 문제 해결 단계 ( http://technet.microsoft.com/en-us/library/ms142560.aspx) 를 수행 한 경우 궁금합니다 .

SQL Server가 모든 메모리를 소비하고 필터 데몬에 아무것도 두지 않도록 내기하고 있습니다. 따라서 페이지 파일로 물건을 교환해야하기 때문에 채우기 속도가 느립니다. SQL이 사용할 수있는 메모리 양을 제한해야합니다 (현재 시스템 사양에 따라 약 3GB 정도라고 생각합니다-FDHost 및 OS의 경우 1GB를 남겨 둡니다).


@Brandon의 투표권. "전체 텍스트 인덱싱 성능 저하의 주요 원인은 다음과 같습니다."
MacGyver

2

다음은 커서를 사용하여 MSSQL2008 용 테이블이있는 테이블의 전체 인덱스를 다시 작성하고 채우는 스크립트입니다. 이것은 MSSQL 2000 서버에서 마이그레이션 된 데이터베이스가있는 프로덕션 환경에서 작동합니다. 변경 내용 추적을 해제하고 SQL Server 에이전트를 통해이 저장 프로 시저를 실행하면됩니다. express를 사용하는 경우 VBS 스크립트를 사용하여 작업 스케줄러를 통해 실행할 수 있습니다.

인덱스를 채우려 고 시도하기 전에 모든 카탈로그에서 먼저 재구성을 수행하는 것이 스크립트에서 중요했습니다.

CREATE PROCEDURE [dbo].[rebuild_repopulate_fulltext] 
AS
BEGIN

Declare @cmdA NVARCHAR(255)
Declare @cmdB NVARCHAR(255)
Declare @cmdC NVARCHAR(255)
DECLARE @Database VARCHAR(255)   
DECLARE @Table VARCHAR(255)  
DECLARE @cmd NVARCHAR(500)  
DECLARE @fillfactor INT 
DECLARE @Catalog VARCHAR(255)
DECLARE @Schema VARCHAR(255)

SET @fillfactor = 90 

DECLARE DatabaseCursor CURSOR FOR  
SELECT name FROM MASTER.dbo.sysdatabases   
WHERE name NOT IN ('master','msdb','tempdb','model','distribution')   
ORDER BY 1  

OPEN DatabaseCursor  

FETCH NEXT FROM DatabaseCursor INTO @Database  
WHILE @@FETCH_STATUS = 0  
BEGIN  

   -- rebuild fulltext catalog
   set @cmd = 'DECLARE CatalogCursor CURSOR FOR 
        SELECT t.name AS TableName, c.name AS FTCatalogName, s.name as schemaname
        FROM ['+ @Database + '].sys.tables t JOIN ['+ @Database +'].sys.fulltext_indexes i
        ON t.object_id = i.object_id
        JOIN ['+ @Database + '].sys.fulltext_catalogs c
        ON i.fulltext_catalog_id = c.fulltext_catalog_id
        JOIN ['+ @Database + '].sys.schemas s ON t.schema_id = s.schema_id'
   --PRINT @cmd
   EXEC (@cmd)  


   OPEN CatalogCursor   

   FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   WHILE @@FETCH_STATUS = 0   
   BEGIN  

    SET @cmdB = 'USE ['+ @Database + ']; ALTER FULLTEXT CATALOG ' + @Catalog + ' REBUILD;'
    --PRINT @cmdB
    EXEC (@cmdB)


    FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   END   

   CLOSE CatalogCursor   


   OPEN CatalogCursor   

   FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   WHILE @@FETCH_STATUS = 0   
   BEGIN  

    SET @cmdC = 'USE ['+ @Database + ']; ALTER FULLTEXT INDEX ON ['+ @Database + '].[' + @Schema + '].[' + @Table + '] START FULL POPULATION;' 
    --PRINT @cmdC
    EXEC (@cmdC)

    FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   END   

   CLOSE CatalogCursor   
   DEALLOCATE CatalogCursor  



   FETCH NEXT FROM DatabaseCursor INTO @Database  
END  

CLOSE DatabaseCursor   
DEALLOCATE DatabaseCursor

END

커서가 필요없는 방법이 있습니까?


0

일반적으로 트리거를 사용하여 전체 텍스트 카탈로그를 업데이트하는 것이 좋습니다. 그것은 내가 mssql에서 사용하는 접근 방식이지만, 제 경우에는 트리거를 사용하여 솔루션으로 연결하는 몇 가지 특정 요구 사항이있는 지역화 된 응용 프로그램이 있기 때문에 솔루션은 2 년 전부터 100 % 작동합니다.

예제 와 비교하여 구현을 검토하십시오 .


현재 내 색인은 자동 변경 추적으로 설정되어 있습니다. 수동으로 변경하고 트리거를 사용하면 이전 테이블 업데이트에서 트리거 된 인덱스 업데이트가 아직 완료되지 전에 인덱스 된 테이블에 레코드를 삽입하거나 업데이트 할 때 실제로 문제가 발생할 수 있다는 것을 읽었습니다. 자동 변경 추적이 작동하는 것처럼 보입니다. 특히 테이블에 많은 레코드가 없기 때문에 특히 그렇습니다.
Jargs

제공 한 예제 링크에 대한 설정을 검토했지만 모든 것이 올바른 것으로 보입니다. 심지어 SQL Server 설치 복구를 시도했지만 문제가 남아 있습니다.
Jargs

1
이것이 관련이 있는지 모르겠지만 Word Breaker 문제로 인해 전체 텍스트 카탈로그 인구에 문제가있었습니다. SSMS를 열고 데이터베이스에서 저장소를 선택한 경우 전체 텍스트 카탈로그를 마우스 오른쪽 단추로 클릭하십시오. 테이블 /보기로 이동하여 언어 단어 분리기를보십시오. 단어 분리기에 다른 언어를 사용하는 열이 있습니까? 같은 표에 단어 분리기에 대해 다른 언어가있는 경우 인구가 작동하지 않습니다. 관련이 없지만 누가 아는가?
Craig Efrein

0

근본 원인이 무엇인지 확실하지 않지만 백업이 발생한 후에 발생할 수 있습니다. 그것이 귀하의 경우에 일어나고 있는지 또는 그 테이블이 다른 테이블과 어떻게 다른지 확실하지 않습니다. 이제 궁금합니다. SQL 복제가 설정되어 있습니까?

임시 수정의 경우,이 경우 테이블에서 "Crawl"(인구)을 수행합니다.

http://msdn.microsoft.com/en-us/library/ms142575(v=sql.105).aspx

이 코드를 사용하십시오 :

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