テーブルAをテーブルBに切り替えると、インデックスデータも切り替えられますか?


8

現在、かなり大きなテーブル(500〜700万行)があります。このテーブルは、ステージングテーブルのデータを構築し、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;

この操作を実行すると、インデックス(または必要に応じてインデックスデータ)の現在の状態も切り替えられますか?私は2つの理由のために尋ねています:

1)SWITCH TOステートメントを実行するには、ソーステーブルとターゲットテーブルの両方に同じインデックスが含まれている必要があります。これにより、インデックスデータも切り替えられる可能性があると思いますが、これを確認する方法がわかりません。
2)この方法でテーブルを作成する主な利点は、使用中に本番テーブルで過度の作業を実行しないようにすることです。当然、ステージングテーブルでインデックスを再構築でき、再構築されたインデックスをテーブルと共に本番用インデックスに切り替えることができれば、とても嬉しく思います。

回答:


6

インデックスデータも切り替えられますか?

はい。クエリが誤った結果を返すか、切り替え後に手動でインデックスを再構築する必要があるため、そうでない場合は奇妙です。

これを確認する方法がわかりません

1つの方法は、それを試してみることです。

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]; 

2つの行を返すプロセスでアクセスされた唯一のオブジェクトは、データが切り替えられている必要があることを示すインデックスでした。

ここに画像の説明を入力してください

また、上記からの結果を比較sys.dm_db_database_page_allocationsするためのGroupEvent_Stagingための同様のクエリでスイッチする前にGroupEvent、スイッチがページヒープ自体(INDEX_ID = 0)と、2つの非クラスタ化インデックス(IDS 2&3)の両方に同じままでいるのを見て後。これは、割り当てられたページの所有権のみが転送されたメタデータであったことを示しています。

ここに画像の説明を入力してください


質問に答えるだけでなく、どのように結論に至ったかを説明してくれてありがとう。すごい!
クリスタ2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.