我正在使用大型数据库,需要有关如何优化我的选择/更新的建议。这是一个前任:
create table Book (
BookID int,
Description nvarchar(max)
)
-- 8 million rows
create table #BookUpdates (
BookID int,
Description nvarchar(max)
)
-- 2 million rows
假设有 800 万本书籍,我必须为其中的 200 万本更新类型。
问题:运行这些更新的时间很长。它偶尔会导致那些也试图从数据库运行语句的用户阻塞。我想出了一个解决方案,但想知道是否有更好的解决方案。我必须准备很多这样的一次性随机更新(无论出于何种原因)
-- normal update
update b set b.Description = bu.Description
from Book b
join #BookUpdates bu
on bu.BookID = b.BookID
-- batch update
while (@BookID < @MaxBookID)
begin
update b set b.Description = bu.Description
from Book b
join #BookUpdates bu
on bu.BookID = b.BookID
where bu.BookID >= @BookID
and bu.BookID < @BookID + 5000
set @BookID = @BookID + 5000
end
第二次更新工作得更快。我喜欢这个解决方案,因为我可以向自己打印状态更新,了解它还剩多长时间,并且不会对我们的客户造成性能问题。
问题:我在这里遗漏了一些重要的东西吗?临时表上的索引?
我更新了示例表,所以我没有得到更多的规范化评论。每本书只有 1 个描述:)