当您将表A切换到表B时,索引数据也会被切换吗?


8

我目前有一个相当大的表(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)以这种方式构建工作台的主要好处是避免在使用过程中对生产工作台进行过多的工作。自然,如果我能够在登台表上重建索引并将重建的索引与表一起切换到生产索引,那会让我感到非常高兴。

Answers:


6

索引数据也会被切换吗?

是。如果不是这样,那将是奇怪的,因为那样查询将返回错误的结果,否则我们将不得不在切换后手动重建索引。

我不知道如何验证

一种方法是尝试一下

CREATE TABLE [dbo].[GroupEvent]
  (
     GroupName VARCHAR(100) INDEX IX_NC_GroupEvent_staging_GroupName,
     Created   DATETIME INDEX IX_NC_GroupEvent_staging_Created 
  );

CREATE TABLE [dbo].[GroupEvent_staging]
  (
     GroupName VARCHAR(100) INDEX IX_NC_GroupEvent_staging_GroupName,
     Created   DATETIME INDEX IX_NC_GroupEvent_staging_Created 
  );

INSERT INTO [dbo].[GroupEvent_staging]
VALUES      ('Group1',GETDATE()),
            ('Group2',GETDATE());

ALTER INDEX IX_NC_GroupEvent_staging_GroupName ON [dbo].[GroupEvent_staging] REBUILD;

ALTER INDEX IX_NC_GroupEvent_staging_Created ON [dbo].[GroupEvent_staging] REBUILD;

SELECT index_id,
       allocated_page_file_id,
       allocated_page_page_id
FROM   sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID('[dbo].[GroupEvent_staging]'), NULL, NULL, 'DETAILED')
WHERE  is_allocated = 1; 

-- Empty production table
TRUNCATE TABLE [dbo].[GroupEvent];

-- Switch data from staging-table into production table
ALTER TABLE [dbo].[GroupEvent_staging] SWITCH TO [dbo].[GroupEvent];

SELECT index_id,
       allocated_page_file_id,
       allocated_page_page_id
FROM   sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID('[dbo].[GroupEvent]'), NULL, NULL, 'DETAILED')
WHERE  is_allocated = 1; 

SELECT GroupName
FROM   [dbo].[GroupEvent];

DROP TABLE [dbo].[GroupEvent], [dbo].[GroupEvent_staging]; 

在返回两行的过程中访问的唯一对象是索引,该索引表明必须已切换数据。

在此处输入图片说明

上面还比较了切换前sys.dm_db_database_page_allocationsfor 的结果和GroupEvent_Staging切换GroupEvent后类似的查询,以查看堆本身(index_id = 0)和两个非聚集索引(ids 2&3)的页面均相同。这表明切换仅是元数据,并且具有已分配的已分配页面的所有权。

在此处输入图片说明


感谢您不仅回答了这个问题,还解释了您是如何得出结论的。大!
krystah
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.