【问题标题】:drop index at partition level在分区级别删除索引
【发布时间】:2009-09-02 14:16:05
【问题描述】:

您知道在 SQL Server (2008) 中是否有任何方法可以做到这一点?

我正在处理 DataWarehouse 加载过程,所以我想做的是删除正在加载的分区的索引,以便我可以执行快速批量加载,然后我可以在分区级别再次重建索引。

我认为在 Oracle 中可以实现这一点,但在 SQL Server 中可能不行。

谢谢, 维克多

【问题讨论】:

    标签: sql-server indexing


    【解决方案1】:

    不,您不能仅删除单个分区的表索引。但是,SQL 2008 提供了一种批量加载方法,包括在同一文件组的单独分区上设置具有完全相同架构的第二个表,加载它,以精确的方式对其进行索引,然后“切换”新分区生产表上现有的空分区。

    不过,这是一个高度简化的描述。这是有关实现此功能的 SQL 2008 的 MSDN 文章: http://msdn.microsoft.com/en-us/library/ms191160.aspx

    【讨论】:

    • 感谢您提供的信息,这正是我想要的。其实今天早上一个同事也给我解释了这个方法。
    【解决方案2】:

    我知道这在 SQL 2005 中是不可能的。我还没有听说过任何可以让您在 2008 年执行此操作的方法,但它可能存在(我已经阅读过但尚未使用它)。我能得到的最接近的是禁用索引,但是如果禁用聚集索引,则无法再访问该表。不是那么有用,恕我直言。

    我的仓库 ETL 项目的解决方案是创建一个表,列出所有索引和索引约束(PK、UQ)。在 ETL 期间,我们遍历表(对于正在加载的所需表集),删除索引/索引约束,加载数据,然后再次遍历表并重新创建索引/约束。有点难看而且有点尴尬,但是一旦启动并运行它就不会中断——并且具有新构建的索引的额外优势(即没有碎片,并且填充因子可以是 100)。添加/修改/删除索引也很尴尬,但不是那么难。

    您可以动态地执行此操作——从目标表中读取和存储索引/约束定义、删除它们、加载数据,然后从存储的数据动态构建和运行(重新)创建脚本。但是,如果在运行过​​程中有什么东西崩溃了,你就死定了。 (这就是我选择永久桌子的原因。)

    我发现这非常适合表分区,因为您在“加载”表上完成了所有工作,而实时(dbo,对我们而言)表没有受到影响。

    【讨论】:

      猜你喜欢
      • 2021-01-28
      • 2015-07-08
      • 2019-01-23
      • 2022-01-26
      • 2023-04-02
      • 2016-12-01
      • 2021-11-22
      相关资源
      最近更新 更多