我在Azure SQL数据库中有5个大表。我通过带有复杂WHERE caluse的sql查询将其中两个表与其他3个表匹配。现在我需要使用其余3个表中的相应字段更新这两个表。我的问题是最好的方法是什么?我将在更新查询中使用我的select中的WHERE子句,因此已经确定,但是当我在整个数据库上运行select而不对特定记录进行过滤时,它需要永远,因为表格很大 - 几百万记录每个。所以我想知道是否有人可以给我一些关于在没有我的连接超时或其他任何事情发生的情况下运行更新的最佳方式的一些指示? SSIS包?通过一些应用更新?任何有用的输入将非常感激
答案 0 :(得分:1)
您谈论的表格有多大,服务水平的目标是什么?升级到V12,假设您有增长空间,扩展到最大SKU,创建任何缺少的索引以便查询快速运行,并运行更新查询。一旦成功,然后缩小。确保将命令timeout设置为无穷大。
答案 1 :(得分:0)
一些想法,首先,如果您有本地SQL服务器,您可以使用Azure Import/Export service下载backpac文件,在本地进行所需的更改,然后上传它们。
如果您没有能力使用本地计算机,则可以使用持久性分页来避免超时。我建议您使用偏移获取和非临时工作表,在您完成后将删除该工作表。类似的东西:
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
在运行此工作表之前,您需要创建工作表。无论如何,这将循环遍历数据,并且由于事务包装器,您不会进行任何部分提交,因此如果超时,您就可以了。它也设置好了你可以再次按f5来拿起你离开的地方。但是,正如我上面提到的,偏移提取会在后端吮吸,因此批量大小合理。
总而言之,我认为backpac的想法是更好的,但是我们不需要拥有我们需要的所有工具。