テーブルのいくつかは REPLICATE 型です。データのクエリを開始する前に、これらのテーブルを実際に (保留中でなく) 複製する必要があります。これにより、データの移動を回避できます。
オンラインで見つけたスクリプトを持っています。これはループで実行され、レプリケーション用に設定されたすべてのテーブルで SELECT TOP 1 を実行しますが、スクリプトが数時間実行されることもあります。foo から SELECT TOP 1 を実行しても、サーバーがレプリケーションをトリガーしない場合があるように見えるかもしれません。
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