禁用索引和删除约束并重建 SQL Server 表的最快方法

Mac*_*ver 2 index sql-server clustered-index t-sql drop-table

下面是我们在一个有几十亿条记录的表上运行的一些 T-SQL 命令。像这样的 5 个表占用了数据库的大部分大小。在不引起任何问题的情况下执行这些步骤的最快方法是什么?仅运行第一个命令就需要一个多小时。删除整个表并重新创建它会更容易吗?或者,对于这么多数据,这是不可能和安全的吗?谁能想到任何其他想法来加快速度?我们只是试图截断数据,然后在我们的 ETL 过程中从头开始重建表。

        DROP INDEX [OF_IDX_ClusteredConcept] ON [dbo].[OBS_FACT] WITH ( ONLINE = OFF )
        ALTER TABLE OBS_FACT DROP CONSTRAINT OBS_FACT_PK
        ALTER INDEX ALL ON OBS_FACT disable;

        -- add new data to OBS_FACT table via ETL process

        ALTER TABLE [dbo].[OBS_FACT] ADD CONSTRAINT [OBS_FACT_PK] PRIMARY KEY NONCLUSTERED 
        (
            [ENCOUNTER_NUM] ASC,
            [CONCEPT_CD] ASC,
            [PROVIDER_ID] ASC,
            [START_DATE] ASC,
            [MODIFIER_CD] ASC,
            [INSTANCE_NUM] ASC
        ) ON [PRIMARY]

        CREATE CLUSTERED INDEX [OF_IDX_ClusteredConcept] ON [dbo].[OBS_FACT] 
        (
            [CONCEPT_CD] ASC
        );  

        -- REBUILD indexes on OBSERVATION_FACT
        ALTER INDEX ALL ON OBS_FACT REBUILD
Run Code Online (Sandbox Code Playgroud)

通常,如果您尝试在不同的窗口中重新启动 SQL Server Management Studio,drop index 命令会在 SQL Server Management Studio 中导致此错误。

超出锁定请求超时期限(Microsoft SQL Server,错误:1222)

Mar*_*son 6

如果您只想截断和重新加载数据,那么使用索引并不一定有用。

如果您按聚集索引顺序(即按CONCEPT_CD ASC顺序)插入数据,那么删除聚集索引并没有真正的优势。在 30 亿行的最后重建它会比首先以聚集索引顺序插入数据要痛苦得多。

但是,如果您想禁用索引,则如下所示:

-- Disable indexes on OBSERVATION_FACT
-- If you're dropping, don't disable. If you're disabling, don't drop...
ALTER INDEX ALL ON OBS_FACT DISABLE;

-- Truncate your table    
TRUNCATE TABLE dbo.OBS_FACT;

-- ETL Process here....

-- REBUILD indexes on OBSERVATION_FACT
-- Or recreate them if you've dropped them in step 1
ALTER INDEX ALL ON OBS_FACT REBUILD WITH (ONLINE = ON);
Run Code Online (Sandbox Code Playgroud)

通过根据脚本立即重建索引来创建以下内容是没有意义的,因为创建会构建索引。为什么要立即重建?

  • 可能值得明确指出`ALTER INDEX ALL ... DISABLE` 也将禁用聚集索引。 (2认同)