0

テーブルのいくつかは 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
4

2 に答える 2

1

Henrik さん、'select top 1' がレプリケートされたテーブル ビルドをトリガーしない場合、それは欠陥です。サポートチケットを提出してください。

システムを見なければ、何が起こっているのかを正確に知ることは不可能です。ビルド時間の延長を検討する際に考えられるいくつかのことを次に示します。

  • レプリケートされたテーブルが大きい (サイズ、必ずしも行ではない) ため、ビルドに長い時間がかかります。
  • レプリケートされたテーブルには、長い構築時間を必要とするセカンダリ インデックスが多数あります。
  • レプリケートされたテーブルのビルドには、statirc20 (2 つの同時実行スロット) が必要です。コンカレンシー スロットが利用できない場合、ビルドは他の実行中のクエリの後にキューに入れられます。
  • レプリケートされたテーブルは、挿入、更新、および削除によって常に変更されています。変更を行うには、テーブルを再構築する必要があります。
于 2019-05-08T22:16:03.797 に答える