为了最大限度地提高 DB 性能,应在通过 SSIS 将大量数据加载到 SQL Server 2008 后运行哪些命令

Mar*_*son 11 performance sql-server ssis sql-server-2008-r2

我已经编写了一个 SSIS 包来将测试数据加载到一个空数据库中。有些表非常大(约 7 亿行)。SSIS 包完成后,是否应该运行任何命令(作为 DBA 学徒!)以最大化数据库的性能?

例如,我执行了EXEC sp_updatestats但它报告没有索引需要更新。

一旦加载了大量数据,是否有一系列要做的事情,或者 SQL Server 2008 是否会为您处理所有这些事情?

Mar*_*ith 8

如果您要加载到空数据库,则可以/应该采取措施避免在加载后需要任何额外的维护步骤。碎片化是敌人,这就是你想要避免的。

  • 在加载之前删除所有 NC 索引。
  • 加载后,按顺序为每个表添加 NC 索引,即不要将索引添加到 TableA,然后是 TableB,然后返回到 TableA。这对碎片没有影响,但它可以缩短在非常大的数据集上添加索引所需的时间(减少缓冲池流失)。
  • 如果您可以按聚集索引顺序向表中插入数据,请保留聚集索引。如果不能,请将数据转储到堆中并在加载后重建到聚集索引中。

我不会复制和粘贴,而是将您指向 ETL 优化的非常全面的参考列表@Marian 放在一起回答我在 BCP 上提出问题。其中许多将同样适用于您的场景。

  • 有趣的是,在指向 SQLCAT 和 SSIS 视频的链接上,他们的发现从未删除 NC 索引。猜猜这是“视情况而定”的另一种情况 (2认同)
  • @billinkc 是不是针对增量加载,而不是这个问题所指的空数据库?无论哪种方式,SQLCAT 测试都倾向于涉及典型组织中很少见的一类硬件。 (2认同)

Mik*_*lsh 5

这取决于您拥有多少窗口,但通常更新统计信息和重建/重组索引是一个很好的步骤。除此之外,您真的不需要做任何其他事情。

统计信息告诉查询优化器有多少行可能受到操作的影响,进而告诉 SQL 采取哪种方法来运行您的查询。插入数据可能会扭曲分布,如果您没有插入足够多的行来触发自动更新模式下的统计信息更新,手动操作应该会有所帮助。如果你有窗口,我说保留统计更新部分。

随着数据的添加,索引可能会变得碎片化。重建或重组有助于减少这种情况,从而提高实际访问数据时的性能。

  • 沿着索引,在 [SQLCAT] 的一个 SSIS 视频中(http://sqlcat.com/sqlcat/b/top10lists/archive/2008/10/01/top-10-sql-server-integration-services -best-practices.aspx),他们还提出了一条经验法则,即如果您的数据增长 > 100% 并且有一个 NCI,请删除并重新创建它们。如果超过 10% 并且有 2+ NCI,drop and recreate 会产生更好的性能。 (4认同)
  • 只是为了澄清比尔的评论 - 我认为他说的建议是让时间删除创建它们意味着删除索引,加载数据,然后重新创建索引..而不是在加载期间将索引留在那里并且后重建。无论如何,我认为是这样:-) 是的,很好,我 +1 评论。 (2认同)