运行 对两个大表的更新查询
Running an update query on two large tables
我在 Azure SQL 数据库中有 5 个大表。我通过具有复杂 WHERE 语句的 sql 查询将其中两个表与其他 3 个表匹配。现在我需要用剩余 3 个表中的相应字段更新这两个表。我的问题是最好的方法是什么?我将在更新查询中使用 select 中的 WHERE 子句,这样就解决了,但是当我 运行 整个数据库的 select 时,没有过滤特定记录,它从字面上看,因为表格很大,所以要永远花很长时间-每个表格都有几百万条记录。所以我想知道是否有人可以给我一些建议,告诉我什么是 运行 更新的最佳方式,而不会使我的连接超时或发生其他任何事情? SSIS包?通过某些应用程序更新?任何有用的输入将不胜感激
一些想法,首先,如果您有本地 sql 服务器,您可以使用 Azure Import/Export service 下载 backpac 文件,在本地进行所需的更改,然后上传它们。
如果您不能使用本地计算机,您可以使用持久性分页来避免超时。我建议使用偏移量提取和非临时工作 table,您将在完成后将其删除。类似于:
declare @RowsToBeUpdated bigint = /* Your required row count */
declare @IterationsCompleted bigint = (select isnull(max(iteration), 0) from Worktable)
Declare @batchsize bigint = 100000 /* or whatever won't fail, remember that offset fetch will get slow on the backend */
Declare @RowsCompleted bigint = @IterationsCompleted * @batchsize
while @RowsCompleted < @RowsToBeUpdated
begin
begin transaction
Update a
set a.value = a.othervalue
from thetable a
inner join (select primarykey from thetable order by primarykey offset @RowsCompleted fetch next @batchsize rows only)
set @IterationsCompleted = @IterationsCompleted +1
insert into worktable (select @IterationsCompleted as iteration)
set @RowsCompleted = @RowsCompleted + @batchsize
commit transaction
end
您需要在 运行 之前创建作品 table。无论如何,这将循环遍历数据,并且由于事务包装器,您不会有任何部分提交,所以如果它超时,您会没事的。它还设置为您只需再次按 f5 即可从中断的地方继续。然而,正如我上面提到的,偏移量提取会在后端造成影响,因此请合理设置批处理大小。
总而言之,我认为 backpac 的想法更好,但有时我们没有所需的所有工具。
您说的表有多大?它的服务级别 objective 是多少?升级到 V12,假设您有增长空间,扩展到最大 SKU,创建任何缺失的索引,以便您的查询 运行s 快速,并且 运行 您的更新查询。一旦成功,然后按比例缩小。确保将命令超时设置为无穷大。
我在 Azure SQL 数据库中有 5 个大表。我通过具有复杂 WHERE 语句的 sql 查询将其中两个表与其他 3 个表匹配。现在我需要用剩余 3 个表中的相应字段更新这两个表。我的问题是最好的方法是什么?我将在更新查询中使用 select 中的 WHERE 子句,这样就解决了,但是当我 运行 整个数据库的 select 时,没有过滤特定记录,它从字面上看,因为表格很大,所以要永远花很长时间-每个表格都有几百万条记录。所以我想知道是否有人可以给我一些建议,告诉我什么是 运行 更新的最佳方式,而不会使我的连接超时或发生其他任何事情? SSIS包?通过某些应用程序更新?任何有用的输入将不胜感激
一些想法,首先,如果您有本地 sql 服务器,您可以使用 Azure Import/Export service 下载 backpac 文件,在本地进行所需的更改,然后上传它们。
如果您不能使用本地计算机,您可以使用持久性分页来避免超时。我建议使用偏移量提取和非临时工作 table,您将在完成后将其删除。类似于:
declare @RowsToBeUpdated bigint = /* Your required row count */
declare @IterationsCompleted bigint = (select isnull(max(iteration), 0) from Worktable)
Declare @batchsize bigint = 100000 /* or whatever won't fail, remember that offset fetch will get slow on the backend */
Declare @RowsCompleted bigint = @IterationsCompleted * @batchsize
while @RowsCompleted < @RowsToBeUpdated
begin
begin transaction
Update a
set a.value = a.othervalue
from thetable a
inner join (select primarykey from thetable order by primarykey offset @RowsCompleted fetch next @batchsize rows only)
set @IterationsCompleted = @IterationsCompleted +1
insert into worktable (select @IterationsCompleted as iteration)
set @RowsCompleted = @RowsCompleted + @batchsize
commit transaction
end
您需要在 运行 之前创建作品 table。无论如何,这将循环遍历数据,并且由于事务包装器,您不会有任何部分提交,所以如果它超时,您会没事的。它还设置为您只需再次按 f5 即可从中断的地方继续。然而,正如我上面提到的,偏移量提取会在后端造成影响,因此请合理设置批处理大小。
总而言之,我认为 backpac 的想法更好,但有时我们没有所需的所有工具。
您说的表有多大?它的服务级别 objective 是多少?升级到 V12,假设您有增长空间,扩展到最大 SKU,创建任何缺失的索引,以便您的查询 运行s 快速,并且 运行 您的更新查询。一旦成功,然后按比例缩小。确保将命令超时设置为无穷大。