首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制复制复制表

强制复制复制表
EN

Stack Overflow用户
提问于 2019-05-05 14:48:56
回答 2查看 177关注 0票数 0

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

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

如何强制SQL Datawarehouse完成复制?

该脚本如下所示:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-05-09 06:16:04

Henrik,如果'select top 1‘没有触发复制表构建,那么这将是一个缺陷。请提交支持票证。

如果不查看您的系统,就不可能确切地知道发生了什么。以下是在考虑延长构建时间时可能需要考虑的几个因素:

  • 复制表很大(大小,不一定是行),需要很长的构建时间。
  • 复制表上有许多二级索引,需要很长的build times.
  • Replicated表构建需要statirc20 (2个并发插槽)。如果并发插槽不可用,构建将在其他正在运行的查询之后排队。
  • 通过插入、更新和删除来不断修改复制表。修改时需要重新构建该表。
票数 1
EN

Stack Overflow用户

发布于 2019-05-06 19:01:28

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

代码语言:javascript
复制
select top 1 * from <table>

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55989526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档