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)
如果您只想截断和重新加载数据,那么使用索引并不一定有用。
如果您按聚集索引顺序(即按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)
通过根据脚本立即重建索引来创建以下内容是没有意义的,因为创建会构建索引。为什么要立即重建?