【发布时间】:2013-01-18 09:43:31
【问题描述】:
我正在处理大型数据库,需要有关如何优化我的选择/更新的建议。这是一个前任:
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
第二次更新速度更快。我喜欢这个解决方案,因为我可以向自己打印状态更新,了解它还剩多长时间,而且不会对我们的客户造成性能问题。
问题:我在这里遗漏了什么重要的东西吗?临时表上的索引?
我更新了EXAMPLE 表,所以我没有得到更多的标准化cmets。每本书只有 1 个描述:)
【问题讨论】:
-
我们在谈论哪个 RDBMS? SQL Server 看起来,但只是为了确定。您能否按现在的方式显示更新的查询计划?
-
SQL 服务器。我没有查询计划,所以当我这样做时,我可能会重新发布问题。我们的数据库真的很慢,所以需要一段时间才能找到 BookID。索引会有帮助吗?
-
两个连接 ID 上的索引几乎总是有助于加快速度,但如果没有看到实际计划就很难确定。
-
更新主表后,bookUpdate 表怎么办?你清除更新了吗?
标签: sql performance stored-procedures