将聚簇索引添加到SQL表:实时生产系统存在哪些危险?

时间:2010-04-22 16:11:41

标签: indexing sql-server-2000

我已经负责一个有10年历史的事务系统,其中大多数业务逻辑是在数据库级别实现的(触发器,存储过程等)。 Win2000服务器,MSSQL 2000企业版。 目前没有考虑更换或更新系统的直接计划。

核心流程是一个执行事务的程序 - 具体来说,它执行带有各种参数的存储过程;我们称之为sp_ProcessTrans。程序以异步间隔执行存储过程。

本身,工作正常,但在远程工作站上有30个此程序实例,所有这些实例都异步执行sp_ProcessTrans,然后从SQL服务器检索数据。执行非常规则 - 每分钟0到60次,具体取决于程序实例负责的项目。

随着10年的数据增长,系统性能大幅下降:原因是Employee表上的死锁,特别是死锁等待时间。

我发现:

  • sp_ProcessTrans的执行中,它从Employee表中选择7次
  • 选择是在不是主键的字段上完成的
  • 此字段不存在索引。因此,每次执行 7次
  • 执行表扫描

因此死锁的原因很明显。我在字段上创建了一个非唯一的有序聚簇索引(几乎唯一,NUM(7)很少更改)。测试环境立即得到改善。 问题是我无法模拟测试环境中的死锁。我需要30个工作站,我需要在这些工作站上模拟“现实”活动,因此可视化已经完成。

我需要知道是否必须安排停机时间。 创建索引不应该是MSSQL的危险操作,但是在事务仍在进行时,在生产数据库上创建此字段索引是否存在任何危险(数据损坏,额外等待时间等)?我可以通过30个站选择交易相当安静的时间。

我有没有隐藏的危险? (如果出现问题,我不期待恢复数据库。使用10年的数据需要花费大量时间。)

1 个答案:

答案 0 :(得分:2)

数据损坏应该不是问题,但如果您尝试向实时生产表添加索引,则可能会遇到问题,因为在创建索引期间表不会响应查询。创建索引将应用排它表锁直到完成,并且所花费的时间取决于许多因素(尤其是行数)。

强烈建议您安排停机时间,这也是一个很好的习惯。显然是备份,以及一个计划,以防你必须撤消你想要的东西。