索引数据也会被切换吗?
是。如果不是这样,那将是奇怪的,因为那样查询将返回错误的结果,否则我们将不得不在切换后手动重建索引。
我不知道如何验证
一种方法是尝试一下
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_allocations
for 的结果和GroupEvent_Staging
切换GroupEvent
后类似的查询,以查看堆本身(index_id = 0)和两个非聚集索引(ids 2&3)的页面均相同。这表明切换仅是元数据,并且具有已分配的已分配页面的所有权。