Saat Anda beralih Tabel A ke Tabel B, apakah data indeks juga dapat dialihkan?

8

Saat ini saya memiliki meja yang agak besar (5-7 juta baris). Tabel ini dibangun kembali secara teratur dengan prosedur yang membangun data dalam tabel pementasan, kemudian mengalihkan data ke dalam tabel produksi menggunakan ALTER TABLE .. SWITCH TO ..pernyataan.

Contoh:

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;

Ketika operasi ini dilakukan, apakah keadaan saat ini dari indeks (atau data indeks jika Anda mau) akan beralih juga? Saya bertanya karena 2 alasan:

1) Untuk melakukan SWITCH TOpernyataan, persyaratannya adalah bahwa tabel sumber dan target harus berisi indeks yang sama. Ini membuat saya percaya bahwa indeks-data mungkin juga diaktifkan, tetapi saya tidak tahu cara memverifikasi ini.
2) Manfaat utama membangun meja dengan cara ini adalah untuk menghindari melakukan pekerjaan berlebihan di atas meja produksi saat sedang digunakan. Secara alami, itu akan membuat saya sangat senang jika saya dapat membangun kembali indeks di atas meja panggung dan membuat indeks yang dibangun kembali dialihkan ke indeks produksi bersama dengan tabel.

krystah
sumber

Jawaban:

6

apakah data indeks juga dapat diaktifkan?

Iya. Akan aneh jika tidak karena permintaan akan mengembalikan hasil yang salah atau kita harus secara manual membangun kembali indeks setelah beralih.

Saya tidak tahu cara memverifikasi ini

Salah satu caranya adalah dengan mencobanya saja

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

Satu-satunya objek yang diakses dalam proses mengembalikan dua baris adalah indeks yang menunjukkan bahwa data tersebut harus diaktifkan.

masukkan deskripsi gambar di sini

Di atas juga membandingkan hasil dari sys.dm_db_database_page_allocationsuntuk GroupEvent_Stagingsebelum beralih dengan permintaan yang sama untuk GroupEventsetelah saklar untuk melihat bahwa halaman tetap sama untuk kedua tumpukan itu sendiri (index_id = 0) dan dua indeks nonclustered (id 2 & 3). Ini menunjukkan bahwa peralihan hanya metadata dengan kepemilikan halaman yang dialokasikan ditransfer.

masukkan deskripsi gambar di sini

Martin Smith
sumber
Terima kasih tidak hanya menjawab pertanyaan, tetapi juga menjelaskan bagaimana Anda sampai pada kesimpulan. Bagus!
krystah