Когда вы переключаете таблицу 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) Основным преимуществом построения стола таким образом является предотвращение чрезмерной работы на рабочем столе во время использования. Естественно, я был бы очень рад, если бы мне удалось перестроить индексы на промежуточной таблице и перевести перестроенные индексы на производственные индексы вместе с таблицей.

krystah
источник

Ответы:

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_allocationsдля for GroupEvent_Stagingbefore the switch с аналогичным запросом for GroupEventafter the switch, чтобы увидеть, что страницы остаются одинаковыми как для самой кучи (index_id = 0), так и для двух некластеризованных индексов (идентификаторы 2 и 3). Это показывает, что переключение было метаданным только с владельцем перенесенных выделенных страниц.

введите описание изображения здесь

Мартин Смит
источник
Спасибо, что не только ответили на вопрос, но и объяснили, как вы пришли к выводу. Большой!
Крыста