2008-11-27 50 views
2

我们必须在周末更新SqlServer2000数据库。加速数据库更新

它的大小差不多是10G。

更新范围从架构更改,主键更新到更新,纠正或插入的某些百万记录。

周末对于这份工作来说已经不够了。

我们建立了一个专门的服务器作业, 打开数据库SINGLE_USER 做我们能想到的任何优化:滴/重新创建索引,关系等

你可以提出任何用来加快进程?

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

编辑:

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

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

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

计算机没有连接到任何网络。

回答

0

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

如果应用程序正在重新编写大块数据,它可能仍然可以使用批量插入来提交新的表数据。通过命令行(bcp等)或通过代码(.NET中的SqlBulkCopy)。这通常会比单独的插页等更快。但它确实取决于这个“定制程序”。

2

尽管删除多余的索引可能会有帮助,但您需要确保保留这些索引,以便升级脚本能够轻松找到需要更新的那些行。否则,请确保服务器中有足够的内存(尽管SQL Server 2000 Standard限制为2 GB),并且如果需要预扩展MDF和LDF文件以应对任何增长。

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

编辑: 理想情况下,尝试并确定哪些操作导致性能较差。如果是模式更改,可能是因为您正在增大列并导致发生大量页面拆分。但是,由于相同的原因,插入和更新时也会发生页面拆分 - 该行不再适合页面。

如果您的C#应用​​程序是瓶颈,您是否可以首先将更改运行到临时表(在维护时段之前),然后对实际表执行单个更新?一百万行的单个更新将比一百万次更新调用的应用程序更有效。无可否认,如果你需要在这个周末做这个,你可能没有足够的时间去设置它。