принудительная репликация реплицированных таблиц - PullRequest
0 голосов
/ 05 мая 2019

Некоторые из моих таблиц имеют тип REPLICATE.Я хотел бы, чтобы эти таблицы были фактически реплицированы (не ожидают обработки), прежде чем я начну запрашивать свои данные.Это поможет мне избежать перемещения данных.

У меня есть скрипт, который я нашел в сети, который работает в цикле и выполняет команду SELECT TOP 1 для всех таблиц, которые настроены для репликации, но иногда скрипт запускаетсячасами.Может показаться, что сервер иногда не запускает репликацию, даже если вы выполните команду SELECT TOP 1 из foo.

Как заставить SQL Datawarehouse завершить репликацию?

Сценарий выглядит примерно такэто:

begin

CREATE TABLE #tbl
WITH
( DISTRIBUTION = ROUND_ROBIN
)
AS
SELECT 
       ROW_NUMBER() OVER(
       ORDER BY
                (
                    SELECT 
                           NULL
                )) AS                                            Sequence
     , CONCAT('SELECT TOP(1) * FROM ', s.name, '.', t.[name]) AS sql_code
FROM sys.pdw_replicated_table_cache_state AS p
JOIN sys.tables AS t
         ON t.object_id = p.object_id
JOIN sys.schemas AS s
         ON t.schema_id = s.schema_id
WHERE p.[state] = 'NotReady';

DECLARE @nbr_statements INT=
        (
            SELECT 
                   COUNT(*)
            FROM #tbl
        ), @i INT= 1;

    WHILE @i <= @nbr_statements

        BEGIN
        DECLARE @sql_code NVARCHAR(4000)= (SELECT 
        sql_code
        FROM #tbl
        WHERE Sequence = @i);
        EXEC sp_executesql @sql_code;
        SET @i+=1;
        END;
        DROP TABLE #tbl;
        SET @i = 0;
        WHILE
              (
                  SELECT TOP (1) 
                         p.[state]
                  FROM sys.pdw_replicated_table_cache_state AS p
                  JOIN sys.tables AS t
                           ON t.object_id = p.object_id
                  JOIN sys.schemas AS s
                           ON t.schema_id = s.schema_id
                  WHERE p.[state] = 'NotReady'
              ) = 'NotReady'
            BEGIN
                IF @i % 100 = 0
                    BEGIN
                        RAISERROR('Replication in progress' , 0, 0) WITH NOWAIT;
                    END;
                SET @i = @i + 1;
            END;

END

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Хенрик, если 'select top 1' не запускает построение реплицированной таблицы, то это будет дефектом.Пожалуйста, отправьте заявку в службу поддержки.

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

  • Реплицированные таблицы большие (размер, необязательно строки), требующие длительного времени сборки.
  • В реплицированной таблице много вторичных индексов, требующих длительного времени сборки.
  • Для построения реплицированной таблицы требуется statirc20 (2 слота параллелизма).Если слоты параллелизма недоступны, сборка будет стоять в очереди за другими выполняющимися запросами.
  • Реплицируемые таблицы постоянно модифицируются с помощью вставок, обновлений и удалений.Модификации требуют, чтобы таблица была построена снова.
0 голосов
/ 06 мая 2019

Лучший способ - запустить такую ​​команду как часть задания, которое создает / обновляет таблицу:

select top 1 * from <table>

Это приведет к его перераспределению в нужное время, без медленного цикла через хранимую процедуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...