下面是我们在具有数十亿条记录的表上运行的一些 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
通常,如果您尝试在不同的窗口中重新启动 SQL Server Management Studio,则 drop index 命令会在 SQL Server Management Studio 中导致此错误。
超过锁定请求超时期限(Microsoft SQL Server,错误:1222)
如果您只想截断并重新加载数据,那么使用索引并不一定有用。
如果您按聚集索引顺序(即按
CONCEPT_CD ASC
顺序)插入数据,那么删除聚集索引并没有真正的优势。最后在 30 亿行上重建它比首先在聚集索引顺序中插入数据要痛苦得多。但是,如果要禁用索引,则如下所示:
通过根据脚本立即重建索引来创建后续是没有意义的,因为创建会构建索引。为什么要立即重建?