Khi bạn chuyển Bảng A sang Bảng B, dữ liệu chỉ mục có được chuyển đổi không?


8

Tôi hiện có một bảng khá lớn (5 - 7 triệu hàng). Bảng này được xây dựng lại thường xuyên bằng thủ tục xây dựng dữ liệu trong bảng phân tầng, sau đó chuyển dữ liệu vào bảng sản xuất bằng cách sử dụng ALTER TABLE .. SWITCH TO ..câu lệnh.

Thí dụ:

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;

Khi thao tác này được thực hiện, trạng thái hiện tại của các chỉ mục (hoặc dữ liệu chỉ mục nếu bạn sẽ) cũng được chuyển đổi? Tôi hỏi vì 2 lý do:

1) Để thực hiện một SWITCH TOcâu lệnh, một yêu cầu là cả bảng nguồn và bảng đích phải chứa các chỉ mục giống hệt nhau. Điều này khiến tôi tin rằng dữ liệu chỉ mục cũng có thể được chuyển đổi, nhưng tôi không biết cách xác minh điều này.
2) Lợi ích chính của việc xây dựng bảng theo cách này là tránh thực hiện công việc quá mức trên bàn sản xuất trong khi sử dụng. Đương nhiên, sẽ rất vui nếu tôi có thể xây dựng lại các chỉ mục trên bảng phân tầng và các chỉ mục được xây dựng lại được chuyển sang các chỉ mục sản xuất cùng với bảng.

Câu trả lời:


6

dữ liệu chỉ mục có được chuyển đổi là tốt?

Đúng. Sẽ thật kỳ quái nếu không vì các truy vấn sẽ trả về kết quả sai hoặc chúng ta sẽ phải tự xây dựng lại các chỉ mục sau khi chuyển đổi.

Tôi không biết làm thế nào để xác minh điều này

Một cách là chỉ cần thử nó

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

Đối tượng duy nhất được truy cập trong quá trình trả về hai hàng là chỉ mục cho thấy dữ liệu phải được chuyển đổi.

nhập mô tả hình ảnh ở đây

Trên đây cũng so sánh kết quả từ sys.dm_db_database_page_allocationscho GroupEvent_Stagingtrước khi chuyển đổi với một truy vấn tương tự cho GroupEventsau khi chuyển đổi để thấy rằng các trang vẫn như cũ cho cả đống bản thân (index_id = 0) và hai chỉ số nonclustered (id 2 & 3). Điều này cho thấy công tắc chỉ là siêu dữ liệu với quyền sở hữu các trang được phân bổ được chuyển.

nhập mô tả hình ảnh ở đây


Cảm ơn vì không chỉ trả lời câu hỏi, mà còn giải thích cách bạn đi đến kết luận. Tuyệt quá!
kstallah
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.