2

有一个 SqlServer2000 数据库我们必须在周末更新。

它的大小几乎是10G。

更新范围从模式更改、主键更新到更新、更正或插入的几​​百万条记录。

周末对这份工作来说是不够的。

我们为这项工作设置了一个专用服务器,将数据库 SINGLE_USER 进行了我们能想到的任何优化:删除/重新创建索引、关系等。

你能提出任何加速这个过程的建议吗?

SQL SERVER 2000 是不可否认的(不是我的决定)。更新是通过定制程序而不是 BULK INSERT 运行的。

编辑:

模式更新由查询分析器 TSQL 脚本完成(每个版本更新一个脚本)

数据更新由 C# .net 3.5 应用程序完成。

数据来自一堆文本文件(有很多问题)并写入本地数据库。

计算机未连接到任何网络。

4

2 回答 2

2

尽管删除多余的索引可能会有所帮助,但您需要确保保留这些索引,以便升级脚本能够轻松找到需要更新的行。

否则,请确保您在服务器中有足够的内存(尽管 SQL Server 2000 Standard 限制为 2 GB),并且如果需要预先增长 MDF 和 LDF 文件以应对任何增长。

如果可能,您的自定义程序应该将更新作为集合而不是逐行处理。

编辑:理想情况下,尝试确定导致性能不佳的操作。如果是架构更改,可能是因为您使列变大并导致发生大量页面拆分。但是,出于同样的原因,在插入和更新时也会发生页面拆分 - 该行不再适合页面。

如果您的 C# 应用程序是瓶颈,您是否可以先将更改运行到临时表中(在您的维护窗口之前),然后对实际表执行一次更新?100 万行的单次更新将比应用程序进行 100 万次更新调用更有效。诚然,如果您需要在本周末进行此操作,您可能没有太多时间进行设置。

于 2008-11-27T08:23:02.080 回答
0

这个“定制程序”到底是什么样的?即它是如何与数据对话的?最小化网络 IO 量(从数据库服务器到应用程序)将是一个好的开始......通常这可能意味着在 TSQL 中做很多工作,但即使只是在数据库服务器上运行应用程序也可能会有所帮助。 ..

如果应用程序正在重写大块数据,它可能仍然能够使用批量插入来提交新的表数据。通过命令行(bcp 等)或通过代码(SqlBulkCopy在 .NET 中)。这通常比单个插入等更快。

但这真的取决于这个“定制程序”。

于 2008-11-27T08:18:03.540 回答