如何在生产中拆分宽表?

Mat*_*ell 5 sql-server

由于一些不断变化的业务需求,我将需要在不久的将来拆分一个大表来支持新的业务需求,从而允许1<=>M从专为1<=>1关系设计的表中建立关系。

挑战在于该表相当大且持续使用。大约有 150 列和 5000 万行。

我正在考虑的方法如下:(该表名为“客户”)

  1. 创建两个新表(Customers_1 和 Customers_Many,表示新表结构。
  2. 根据需要复制所有数据。
  3. 创建一个视图,从Customers_1 和Customers_M 中选择完全复制Customers 表的视图。
  4. 创建一个触发器来处理视图上的插入/更新以更新父表。
  5. 更新外键以指向新表。
  6. 使用 sp_rename 交换表和视图。
  7. 在后续迭代中更改代码以指向新表,而不是视图。
  8. (最终)删除视图,删除旧表。

任何人都可以推荐这种方法的任何挑战、验证这种方法或提供不同的方法吗?

Wor*_*DBA 2

根据我自己的经验,您的方法几乎与我需要时采取的方法相同。在执行拆分之前,我做了一些额外的工作,这让我更好地了解了这可能产生的潜在影响,例如:

  • 查询sys.sql_modules在其定义中引用该表的任何对象
  • 在测试中创建最终设计的缩小副本并将客户指向它(这使您/应用程序开发人员能够知道将来可能需要更改哪些内容)
  • 运行探查器跟踪以捕获针对数据库执行的查询(这些查询未存储在数据库本身中)。
  • 根据上述步骤中识别的查询,为新表结构设计索引。

你的方法和我采用的方法之间唯一的主要区别是我只创建了一个新表(我通过删除不需要的列然后重命名它来更改原始表),这样就减少了执行发布的时间(我需要以这种方式复制更少的数据)。我在发布之前进行了完整备份,并且不愿意在数据库中保留相同数据的两个副本。

  • 我建议在 Profiler 上使用[扩展事件](https://msdn.microsoft.com/en-us/library/bb630282(v=sql.120).aspx),因为它[已弃用](https://msdn .microsoft.com/en-us/library/ms181091(v=sql.120).aspx),特别是如果它将投入生产的话。 (2认同)