我们有一些表会在 SQL Server 中定期重新计算。计算需要几秒钟到几分钟的时间,我们执行以下操作:
- 将结果转储到compute_table_tmp
- 删除计算表
- 将计算表_tmp 重命名为计算表。 (以及所有索引)。
但是,我们似乎仍然遇到并发问题,我们的应用程序请求一个 View ,该 View 在计算表不再存在的精确时刻使用它。
在确保高可用性的同时避免此类问题的最佳技术是什么?
最佳答案
如果此表是您的高可用性要求的一部分,那么您就不能按照以前的方式执行此操作。在生产 SQL 环境中删除表会破坏高可用性的概念。
您也许能够通过创建 one or more partitions on this table 来实现您想要实现的目标。分区表分为行子组,这些行子组可以分布在数据库中的多个文件组中。然而,出于查询目的,该表仍然是单个逻辑实体。使用表分区的优点是您可以在不破坏数据库完整性的情况下移动数据子集,即高可用性仍然存在。
在您的场景中,您必须修改流程,以便所有事件都在表的生产版本中进行。新行将根据 partition function 的值转储到单独的分区中。 。那么你需要switch分区。
您需要做的事情之一是确定表中可用作分区列的列,该列决定将行分配到哪个分区。例如,这可能是指示行生成时间的日期时间列。您甚至可以使用计算列来实现此目的,前提是它是 PERSISTED 列。
需要注意的是:表分区并非在 SQL Server 的所有版本中都可用...我不相信 Standard 具有此功能。
关于sql-server - SQL Server : Best technique to regenerate a computed table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098049/