Azure 强制复制已复制表

Azure 强制复制已复制表,azure,sql-data-warehouse,azure-sql-data-warehouse,Azure,Sql Data Warehouse,Azure Sql Data Warehouse,我的一些表属于REPLICATE类型。在我开始查询数据之前,我希望这些表实际上是复制的,而不是挂起的。这将帮助我避免数据移动 我有一个脚本,我在网上找到的,它在循环中运行,并对所有设置为复制的表执行SELECT TOP 1,但有时脚本会运行数小时。即使您从foo中选择Top1,服务器有时似乎也不会触发复制 如何强制SQL数据仓库完成复制 脚本如下所示: begin CREATE TABLE #tbl WITH ( DISTRIBUTION = ROUND_ROBIN ) AS SELECT

我的一些表属于REPLICATE类型。在我开始查询数据之前,我希望这些表实际上是复制的,而不是挂起的。这将帮助我避免数据移动

我有一个脚本,我在网上找到的,它在循环中运行,并对所有设置为复制的表执行SELECT TOP 1,但有时脚本会运行数小时。即使您从foo中选择Top1,服务器有时似乎也不会触发复制

如何强制SQL数据仓库完成复制

脚本如下所示:

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

最好的方法是在创建/更新表的作业中运行如下命令:

select top 1 * from <table>

这将迫使它在正确的时间重新分发,而不会在存储过程中进行缓慢的循环。

Henrik,如果“select top 1”没有触发复制表生成,那么这将是一个缺陷。请提交一份支持票

如果不查看您的系统,就不可能确切地知道发生了什么。这里有几件事可以考虑到延长的构建时间:

复制表的大小很大,不一定是需要较长构建时间的行。 复制表上有许多次索引需要较长的构建时间。 复制的表生成需要statirc20 2个并发插槽。如果并发插槽不可用,则生成将在其他正在运行的查询之后排队。 通过插入、更新和删除不断修改复制的表。修改需要重新构建表。
执行“选择顶部1”不会产生这样的效果。Select top 1将触发表以进行定时复制。从这个意义上讲,它不是同步的。您无法保证何时进行复制,因此,脚本就是这样做的,它等待表被复制。非常好的洞察力,谢谢。复制的表不太大。没有二级索引。在largerc下运行。运行此脚本时,所有更改都已完成。下一步是填充事实表。wierd的意思是,有时候这个脚本会运行几个小时,直到实例没有缩小,才会停止。