2009-09-17 28 views
2

上一大桌改变给定列的XML架构集合时,我看到我们的企业应用了巨大的性能损失。简单地说,我们正在做这样的事情:XML架构集合变化 - 巨大的性能击中

ALTER TABLE HugeTable ALTER COLUMN CustomFields XML 

(注:CustomFields以前绑定到XML(CustomFieldsSchemaCollection,但当然我们需要修改XML架构,所以我们需要这个语句,使该模式可以修改)

然后,修改后CustomFieldSchemaCollection,我们这样做:

ALTER TABLE HugeTable ALTER COLUMN CustomFields XML(CustomFieldSchemaCollection) 

第一条语句需要8分钟,第二次发言需要10分钟

我们发现,我们可以通过使用稍微优化的第一条语句(50%的性能提升)以下:

ALTER TABLE HugeTable ALTER COLUMN CustomFields nvarchar(max) 

的效果是,第一个语句需要4分钟,第二次发言需要10(所以,14分钟,从18下降)。

底线的问题是... 有没有办法做到这一点“XML模式重新绑定”(或任何一个调用它),以避免SQL Server的完全不必要的和多余的每一个值的检查方式在列中? (注意:是的,我们可以安全地假设该表中现有的XML数据将符合新的xml架构集合。)

感谢任何能够协助的人!

+0

,如果这是一个时间的变化,需要15-20分钟的大事情是什么? – 2009-09-17 13:18:38

+0

KM:很好的问题!这是升级过程的一部分。不幸的是,即使半大型数据库它采取了很长时间 - 时间 - 并导致升级失败(超时错误)。作为一家公司,我们正试图摆脱“只是增加超时阈值”的解决方案,因为这太过于刁钻我们。 – Garrett 2009-09-17 18:17:29

回答

0

如果那时候真的是一个大问题(其在1次升级应该没有真正的问题了)你能考虑只移除基础数据,做你重新绑定到新的模式,然后做批量插入转动所有的身份插入问题等...?

还是一个超级逐步,编写一个脚本,它下面的批次:

  1. 更改表,并用新的模式
    结合
  2. 设置新的列数据增加一个新的XML列=新老列数据
  3. 删除旧列。
  4. 重命名新列旧列名。
  5. 修改序数,如果需要(不同的主题...除非你所有的消费查询安全地通过指定列名,而不是对
    底层序数依靠书面 )