Azure 强制复制已复制表
我的一些表属于REPLICATE类型。在我开始查询数据之前,我希望这些表实际上是复制的,而不是挂起的。这将帮助我避免数据移动 我有一个脚本,我在网上找到的,它在循环中运行,并对所有设置为复制的表执行SELECT TOP 1,但有时脚本会运行数小时。即使您从foo中选择Top1,服务器有时似乎也不会触发复制 如何强制SQL数据仓库完成复制 脚本如下所示: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
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的意思是,有时候这个脚本会运行几个小时,直到实例没有缩小,才会停止。