我们必须在周末更新SqlServer2000数据库。
它的大小几乎是10G。
更新范围从架构更改,主键更新到更新,更正或插入的某些百万条记录。
周末对于这份工作来说还不够。
我们为这份工作设置了专用服务器, 打开数据库SINGLE_USER 做了我们能想到的任何优化:删除/重新创建索引,关系等。
你能提出什么方法来加快这个过程吗?
SQL SERVER 2000不可否定(不是我的决定)。更新通过自定义程序运行,而不是BULK INSERT。
编辑:
架构更新由查询分析器TSQL脚本完成(每个版本更新一个脚本)
数据更新由C#.net 3.5 app。
完成数据来自一堆文本文件(有很多问题)并写入本地数据库。
计算机未连接到任何网络。
答案 0 :(得分:2)
虽然删除多余的索引可能有所帮助,但您需要确保保留那些使升级脚本能够轻松找到需要更新的行的索引。
否则,请确保服务器中有足够的内存(尽管SQL Server 2000标准限制为2 GB),如果需要预先增长MDF和LDF文件以应对任何增长。
如果可能,您的自定义程序应该将更新作为集处理而不是逐行处理。
编辑: 理想情况下,尝试并确定哪个操作导致性能不佳。如果它是架构更改,可能是因为您将列更大并导致大量页面拆分发生。但是,出于同样的原因插入和更新时也会发生页面拆分 - 该行将不再适合页面。
如果您的C#应用程序是瓶颈,您是否可以先将更改运行到临时表(维护窗口之前),然后对实际表执行单个更新?单个100万行的更新将比进行100万次更新调用的应用程序更有效。不可否认,如果你本周末需要这样做,你可能没有太多时间来设置它。
答案 1 :(得分:0)
这个“定制程序”到底是什么样的?即如何与数据交谈?最小化网络IO的数量(从数据库服务器到应用程序)将是一个良好的开端......通常这可能意味着在TSQL中执行大量工作,但即使只是在数据库服务器上运行应用程序也可能有所帮助。 ..
如果应用程序正在重写大块数据,它仍然可以使用批量插入来提交新的表数据。通过命令行(bcp等)或通过代码(.NET中的SqlBulkCopy
)。这通常比单个插入等更快。
但它确实取决于这个“定制程序”。