繁体   English   中英

20百万行以上的更新集?

[英]Update Set for 20+ million rows?

我有一年中每个月的表格,该表格中(除其他事项外)有25列用于自定义数据。 仅对前8个数据列进行了索引,并且我们已将数据插入到第21列中,现在它们要对它们进行通配符搜索。 我无法为第21列创建索引,因为该应用程序不允许在其GUI中的前8个数据列之外的任何内容上进行通配符搜索。

我尝试运行以下命令,但是在事务日志满时它超时,此后将其更改为无限制增长,因为它被设置为134 GB最大大小。

UPDATE CentralContact.dbo.Spd_month_1 
SET p1_value = p21_value 
WHERE dbs_id ='190'

每个表包含超过2000万条记录,有没有更快的方法呢?

即使您是在笔记本电脑上运行,2000万行也不是很多行。 我的联想x1(SSD + 8GB RAM)上有几亿行的测试表。 我的服务器具有数十亿行的表(未分区)。

由于事务日志已满,您的更新查询超时实际上不是性能问题。 看起来您要么最近没有备份事务日志,要么行相当大,即使有1个大事务也正在填满日志。 有两个选项可供考虑:

  1. 备份事务日志以释放以前所有已提交事务的空间。 如果您最近还没有这样做,那可能是现在最好的事情。 在线查找SQL Server书籍以获取有关如何执行此操作的详细信息。 134GB的空间很大,如果自首次创建以来就自动增长,则可能会有太多的虚拟日志文件和大量的物理碎片-两者都会对性能产生重大负面影响(如果您在SSD上运行,则物理碎片会好)。 另外,每次自动增长都会变得更糟,因为在使用前需要初始化Tlog空间,因此您正在初始化越来越大的块。 强烈建议清除维护日志,并在获得维护窗口时从头开始以“合理”的大小进行重新创建。

  2. 将更新分为几个较小的事务。 根据架构的其余部分,这可能很容易,也可能不容易。 如果有一列具有某种单调值(例如时间戳,日期,身份,ID等),则可以轻松地一次更新范围。 具有少量唯一值的列也很有用。 请注意,在进行更改时,您不会添加或更新大量新值。 如果您不是24x7全天候操作,则将数据库锁定在单用户模式下以进行更新和验证是最简单的解决方案,尽管繁琐。

执行所需操作的最简单方法可能是使用视图。 首先,重命名表,然后创建一个视图以修改列:

sp_rename 'CentralContact.dbo.Spd_month_1 ', '_Spd_month_1'

create view Spd_month_1 as
    select p_col21 as p_col1, . . .
    from _Spd_month_1;

该视图非常简单,因此可以用于更新。 您没有删除原始表,因此保留了约束,外键引用,触发器等。 应用程序应该能够像访问表一样容易地访问视图。

更新的问题是每一行都被更改,因此每一行都被记录下来。 即使使用SQL Server的最小日志记录功能,也是如此。 解决此问题的一种方法是将表复制到另一个位置,截断它,然后重新插入数据。 但是,在134 GB的情况下,我将尽量减少任何数据移动操作。

您可能要使用的是Pentaho的水壶(或“汤匙”)。 在这里查看

它的作用是具有“工作”和“转换”以及其他自动化过程,您可以维护各种服务器和数据库。

它要做的一件事是批量更新。 您可以选择要更新的整个记录​​集,然后每隔几秒钟将其送入1000条记录,以进行更新和提交。 这样就不会无休止地锁定桌子。

我一直使用它,并且在对繁忙的流量/繁重的表进行大型更新时,绝不建议使用除此方法以外的其他方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM