program tip

SQL 전체 텍스트 인덱스 채우기가 언제 완료되었는지 어떻게 알 수 있습니까?

radiobox 2020. 12. 29. 06:57
반응형

SQL 전체 텍스트 인덱스 채우기가 언제 완료되었는지 어떻게 알 수 있습니까?


테스트 SQL Server 데이터베이스에 대해 실행되는 ASP.NET 응용 프로그램에 대한 단위 테스트를 작성하고 있습니다. 즉, ClassInitialize 메서드는 테스트 데이터로 새 데이터베이스를 만들고 ClassCleanup은 데이터베이스를 삭제합니다. 코드에서 .bat 스크립트를 실행하여이를 수행합니다.

테스트중인 클래스에는 프로덕션 데이터베이스가 아닌 단위 테스트 데이터베이스에 연결하는 연결 문자열이 제공됩니다.

우리의 문제는 데이터베이스에 전체 텍스트 인덱스가 포함되어 있으며 테스트가 예상대로 실행 되려면 테스트 데이터로 완전히 채워 져야합니다.

내가 알 수있는 한 전체 텍스트 인덱스는 항상 백그라운드에서 채워집니다. 다음 중 하나를 수행하고 싶습니다.

  1. 동기 (Transact-SQL?) 문을 사용하여 완전히 채워진 전체 텍스트 인덱스를 생성합니다.
  2. 전체 텍스트 채우기가 완료되는시기를 확인하거나 콜백 옵션이 있습니까? 아니면 반복적으로 요청할 수 있습니까?

내 현재 해결책은 문서에서 아무것도 찾을 수 없기 때문에 클래스 초기화 메서드가 5 초 동안 작동하는 것처럼 마지막에 지연을 강제하는 것입니다.


FULLTEXTCATALOGPROPERTY를 사용하여 상태를 쿼리 할 수 ​​있습니다 ( http://technet.microsoft.com/en-us/library/ms190370.aspx 참조 ).

예를 들면 :

SELECT
    FULLTEXTCATALOGPROPERTY(cat.name,'ItemCount') AS [ItemCount],
    FULLTEXTCATALOGPROPERTY(cat.name,'MergeStatus') AS [MergeStatus],
    FULLTEXTCATALOGPROPERTY(cat.name,'PopulateCompletionAge') AS [PopulateCompletionAge],
    FULLTEXTCATALOGPROPERTY(cat.name,'PopulateStatus') AS [PopulateStatus],
    FULLTEXTCATALOGPROPERTY(cat.name,'ImportStatus') AS [ImportStatus]
FROM sys.fulltext_catalogs AS cat

또한 SQL 프로필러를 사용하여 카탈로그의 속성 대화 상자를 표시 할 때 SQL Server Management Studio에서 실행하는 명령을 모니터링 할 수 있습니다. 대화 상자에는 인구 상태 표시가 포함되며 표시된 모든 정보는 T-SQL을 사용하여 쿼리됩니다.


@Daniel Renshaw의 답변을 읽기 쉬운 버전으로 제공하고 싶습니다.

DECLARE @CatalogName VARCHAR(MAX)
SET     @CatalogName = 'FTS_Demo_Catalog'

SELECT
    DATEADD(ss, FULLTEXTCATALOGPROPERTY(@CatalogName,'PopulateCompletionAge'), '1/1/1990') AS LastPopulated
    ,(SELECT CASE FULLTEXTCATALOGPROPERTY(@CatalogName,'PopulateStatus')
        WHEN 0 THEN 'Idle'
        WHEN 1 THEN 'Full Population In Progress'
        WHEN 2 THEN 'Paused'
        WHEN 3 THEN 'Throttled'
        WHEN 4 THEN 'Recovering'
        WHEN 5 THEN 'Shutdown'
        WHEN 6 THEN 'Incremental Population In Progress'
        WHEN 7 THEN 'Building Index'
        WHEN 8 THEN 'Disk Full.  Paused'
        WHEN 9 THEN 'Change Tracking' END) AS PopulateStatus
FROM sys.fulltext_catalogs AS cat

결과 :

LastPopulated           PopulateStatus
----------------------- ----------------------------------
2012-05-08 14:51:37.000 Idle

(1 row(s) affected)

이것은 GarethOwen의 답변을 기반으로 만든 저장 프로 시저입니다. 쉼표로 구분 된 테이블 목록을 매개 변수로 받아들이고 모든 테이블에 대한 전체 텍스트 인덱스가 업데이트 될 때까지 기다립니다. 디스크 스 래싱을 방지하기 위해 10 분의 1 초마다이 검사를 수행하고 상황이 느리게 / 파손 된 경우를 대비하여 10 초 후에 시간 초과됩니다. FT 검색이 여러 인덱스에 걸쳐있는 경우 유용합니다.

다음과 같은 방식으로 호출됩니다.

EXECUTE [dbo].[WaitForFullTextIndexing] 'MY_TABLE,ALTERNATE_NAMES,TAG_GROUP_VALUES,TAG_GROUPS,FIELD_OPTION';

출처 :

CREATE PROCEDURE WaitForFullTextIndexing
    @TablesStr varchar(max)
AS
BEGIN
    DECLARE @Tables AS TABLE( [word] [varchar](8000) NULL)

    INSERT INTO @Tables (word) SELECT items from dbo.Split(@TablesStr, ',');

    DECLARE @NumberOfTables int;
    SELECT @NumberOfTables = COUNT(*) from @Tables;

    DECLARE @readyCount int;
    SET @readyCount = 0;

    DECLARE @waitLoops int;
    SET @waitLoops = 0;

    DECLARE @result bit;

    WHILE @readyCount <> @NumberOfTables AND @waitLoops < 100
    BEGIN

        select @readyCount = COUNT(*)
        from @Tables tabs
        where OBJECTPROPERTY(object_id(tabs.word), 'TableFulltextPopulateStatus') = 0;

        IF @readyCount <> @NumberOfTables
        BEGIN
            -- prevent thrashing
            WAITFOR DELAY '00:00:00.1';
        END

        set @waitLoops = @waitLoops + 1;

    END

END
GO

dbo.split은 이제 모든 사람이 가져야하는 테이블 값 함수로, 구분 기호의 문자열을 임시 테이블로 분할합니다.

CREATE FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1))        
returns @temptable TABLE (items varchar(8000))        
as        
begin        
    declare @idx int        
    declare @slice varchar(8000)        

    select @idx = 1        
        if len(@String)<1 or @String is null  return        

    while @idx!= 0        
    begin        
        set @idx = charindex(@Delimiter,@String)        
        if @idx!=0        
            set @slice = left(@String,@idx - 1)        
        else        
            set @slice = @String        

        if(len(@slice)>0)   
            insert into @temptable(Items) values(@slice)        

        set @String = right(@String,len(@String) - @idx)        
        if len(@String) = 0 break        
    end    
return        
end 

GO

감사합니다 Daniel, 귀하의 답변으로 올바른 방향으로 나아갔습니다.

실제로 다음 T-SQL 문을 사용하여 전체 텍스트 인덱스의 채우기 상태가 유휴 상태인지 묻습니다.

SELECT OBJECTPROPERTY(object_id('v_doc_desc_de'), 'TableFulltextPopulateStatus')

'v_doc_desc_de'는 색인화하는 데이터베이스 뷰의 이름입니다.

If the population status is not idle, I wait a couple of seconds and ask again, until it is Idle. It is important to wait a small amount of time between checks to ensure the full text population is not slowed down by continuously checking the population status.

The MSDN documentation states that the OBJECTPROPERTYEX function (at table level) is recommended over the FULLTEXTCATALOGPROPERTY statement with property 'PopulateStatus'. It states the following:

The following properties will be removed in a future release of SQL Server: LogSize and PopulateStatus. Avoid using these properties in new development work, and plan to modify applications that currently use any of them.


To wait for a full text catalog to finish population of all its tables and views without having to specify their names, you can use the following stored procedure. This is a combination of JohnB's answer to this question and the answer by cezarm to a related question:

CREATE PROCEDURE WaitForFullTextIndexing
@CatalogName VARCHAR(MAX)
AS
BEGIN
    DECLARE @status int;
    SET @status = 1;
    DECLARE @waitLoops int;
    SET @waitLoops = 0;

    WHILE @status > 0 AND @waitLoops < 100
    BEGIN       
        SELECT @status = FULLTEXTCATALOGPROPERTY(@CatalogName,'PopulateStatus')
        FROM sys.fulltext_catalogs AS cat;

        IF @status > 0
        BEGIN
            -- prevent thrashing
            WAITFOR DELAY '00:00:00.1';
        END
        SET @waitLoops = @waitLoops + 1;
    END
END

ReferenceURL : https://stackoverflow.com/questions/2727911/how-can-i-know-when-sql-full-text-index-population-is-finished

반응형