我目前有一个相当大的表(5-7 百万行)。ALTER TABLE .. SWITCH TO ..
该表通过在临时表中构建数据的过程定期重建,然后使用语句将数据切换到生产表中。
例子:
BEGIN TRAN;
-- Rebuild indexes
ALTER INDEX IX_NC_GroupEvent_staging_GroupName on [dbo].[GroupEvent_staging]
REBUILD;
ALTER INDEX IX_NC_GroupEvent_staging_Created ON [dbo].[GroupEvent_staging]
REBUILD;
-- Empty production table
TRUNCATE TABLE [dbo].[GroupEvent];
-- Switch data from staging-table into production table
ALTER TABLE [dbo].[GroupEvent_staging] SWITCH TO [dbo].[GroupEvent]
COMMIT;
执行此操作时,索引的当前状态(或索引数据,如果您愿意的话)是否也会切换?我问是因为两个原因:
1)为了执行一个SWITCH TO
语句,一个要求是源表和目标表都必须包含相同的索引。这让我相信索引数据也可能被切换,但我不知道如何验证这一点。
2) 以这种方式构建表的主要好处是避免在使用时对生产表执行过多的工作。当然,如果我能够在临时表上重建索引并将重建的索引与表一起切换到生产索引,那我会非常高兴。
是的。如果不这样做会很奇怪,因为查询会返回错误的结果,或者我们必须在切换后手动重建索引。
一种方法是尝试一下
在返回两行的过程中访问的唯一对象是显示数据必须已切换的索引。
上面还将切换前的结果与切换后
sys.dm_db_database_page_allocations
的GroupEvent_Staging
类似查询进行了比较GroupEvent
,以查看堆本身(index_id=0)和两个非聚集索引(ids 2 & 3)的页面保持不变。这表明切换是元数据,仅具有转移的分配页面的所有权。