Как я могу узнать, когда SQL полное текстовое индекс населения закончено?

StackOverflow https://stackoverflow.com/questions/2727911

Вопрос

Мы записываем модульные тесты для нашего приложения ASP.NET, которые работают против тестовой базы данных SQL Server. То есть метод ClassInitialize создает новую базу данных с тестовыми данными, а классCleanup удаляет базу данных. Мы делаем это, бегая .BAT Scripts из кода.

Классы по тестированию задаются строки подключения, которая подключается к базе данных тестирования устройства, а не в производственной базе данных.

Наша проблема заключается в том, что база данных содержит полный текстовый индекс, который должен быть полностью заполнен тестовыми данными для наших тестов, как ожидалось.

Насколько я могу сказать, индекс FullText всегда заполнен на заднем плане. Я хотел бы иметь возможность либо:

  1. Создайте полный текстовый индекс, полностью заполненные, с синхронным (Transact-SQL?), Или
  2. Узнайте, когда популяция FullText закончена, есть ли вариант обратного вызова, или я могу попросить неоднократно спросить?

Мое нынешнее решение заключается в том, чтобы заставить задержку в конце концов метод инициализации класса - 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 Profiler для мониторинга того, какие команды SQL Server Management 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)

Это сохраненная процедура, которую мы создали на основе ответа Гареоуэна. Он принимает запятую список таблиц в качестве параметров и ждет до тех пор, пока не обновляются полный текстовые индексы на всеми из них. Это делает эту проверку каждой десятой секунды, чтобы предотвратить выбивание диска и времена после 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

Спасибо Даниэль, ваш ответ получил меня на правильном пути.

На самом деле я использую следующие оператор T-SQL, чтобы спросить, если статус населения полного текстового индекса простаивается:

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

'v_doc_desc_de' - это имя представления базы данных, которую мы индексируем.

Если статус населения не простаивает, я жду пару секунд и спроси снова, пока не простаивает. Важно подождать небольшое количество времени между проверками, чтобы гарантировать, что полное текстовое население не замедляется, постоянно проверяя статус населения.

То MSDN Документация утверждает, что то OBJECTPROPERTYEX Функция (на уровне таблицы) рекомендуется по FULLTEXTCATALOGPROPERTY Заявление с собственностью «популяциотатус». Он утверждает следующее:

Следующие свойства будут удалены в будущем выпуске SQL Server: Logsize и Populatestatus. Избегайте использования этих свойств в новых работах разработки и планируйте изменять приложения, которые в настоящее время используют любой из них.

Чтобы дождаться полноценного каталога для завершения популяции всех его столов и представлений без необходимости указывать их имена, вы можете использовать следующую хранимую процедуру. Это сочетание ответа Джонба на этот вопрос и ответ CEZARM к Похожие вопросы:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top