我的一些表属于REPLICATE类型。在我开始查询数据之前,我希望这些表被实际复制(而不是挂起)。这将帮助我避免数据移动。
我有一个在网上找到的脚本,它在循环中运行,并在所有设置为复制的表上执行SELECT TOP 1,但有时该脚本会运行数小时。看起来服务器有时不会触发复制,即使您从foo中选择了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发布于 2019-05-09 06:16:04
Henrik,如果'select top 1‘没有触发复制表构建,那么这将是一个缺陷。请提交支持票证。
如果不查看您的系统,就不可能确切地知道发生了什么。以下是在考虑延长构建时间时可能需要考虑的几个因素:
发布于 2019-05-06 19:01:28
最好的方法是在创建/更新表的作业中运行如下命令:
select top 1 * from <table>这将强制在正确的时间重新分发它,而不会在存储过程中进行缓慢的循环。
https://stackoverflow.com/questions/55989526
复制相似问题