@HandyD là hoàn toàn chính xác, tôi chỉ muốn làm nổi bật một số phương pháp khác để có được nén trong khi chèn vào một đống.
Từ cùng một tài liệu
Khi heap được cấu hình để nén cấp trang, các trang chỉ nhận được nén cấp trang theo các cách sau:
- Dữ liệu được nhập số lượng lớn với tối ưu hóa hàng loạt được kích hoạt.
- Dữ liệu được chèn bằng cú pháp INSERT INTO ... VỚI (TABLOCK) và bảng không có chỉ mục không bao gồm.
- Một bảng được xây dựng lại bằng cách thực hiện câu lệnh ALTER TABLE ... REBUILD với tùy chọn nén PAGE.
Theo đó, bạn có thể tận dụng các phần chèn hàng loạt được ghi lại tối thiểu hoặc sử dụng INSERT INTO ... WITH (TABLOCK) để có được PAGEnén mà không phải thực hiện xây dựng lại.
(a) chuyện gì đang xảy ra ở đây? và (b) có cách nào để có được kích thước nén cực nhỏ này trực tiếp khi tôi tải bảng mà không phải xây dựng lại sau khi dữ liệu được tải không?
Có các quy tắc để có được PAGEnén khi chèn vào một đống, thêm -h "TABLOCK"vào bcplệnh của bạn để có được nén.
ROWnén hoạt động mà không có các điều kiện tiên quyết này và là mức nén ít nhất được sử dụng trong các ví dụ dưới đây, cảm ơn @DenisRubashkin đã chỉ ra điều đó!
Kiểm tra
Ví dụ bắt đầu dữ liệu & lệnh BCP out
--Tested on SQL Server 2014 SP2
CREATE TABLE dbo.CompressedHeap_Source( Val varchar(512),
Datefield Date,
Tinyfield TinyINT,
Floatfield float)
WITH (DATA_COMPRESSION = PAGE);
INSERT INTO dbo.CompressedHeap_Source
(
Val,Datefield,Tinyfield,Floatfield)
SELECT 'Bla',cast(getdate() as date),1,1.2412
FROM master..spt_values spt1
CROSS APPLY master..spt_values spt2;
--bcp TEST.dbo.CompressedHeap_Source out E:\Data\HeapData.bcp -c -T
Các ROWnén và không nén kích thước
Kích thước dữ liệu là 132272 KBkhi thực hiện chèn tiêu chuẩn vào heap, đây là ROWnén nhưng không được PAGEnén.
Kích thước dữ liệu mà không có bất kỳ nén là ~ 176216 KBcho thử nghiệm của chúng tôi.
exec sp_spaceused 'dbo.CompressedHeap_Source'
name rows reserved data index_size unused
CompressedHeap_Source 6365530 132296 KB 132272 KB 8 KB 16 KB
XÁC NHẬN VÀO ... VỚI TABLOCK
Chèn WITH TABLOCKcho chúng ta PAGEkích thước dữ liệu nén , 69480 KB.
INSERT INTO dbo.CompressedHeap_Source2 WITH(TABLOCK)
(
Val,Datefield,Tinyfield,Floatfield)
SELECT 'Bla',cast(getdate() as date),1,1.2412
FROM master..spt_values spt1
CROSS APPLY master..spt_values spt2
SỐ LƯỢNG LỚN
Bây giờ khi chúng ta tạo một bảng heap đích cũng được pagenén và thực hiện chèn số lượng lớn with tablock:
CREATE TABLE dbo.CompressedHeap_Destination( Val varchar(512),
Datefield Date,
Tinyfield TinyINT,
Floatfield float)
WITH (DATA_COMPRESSION = PAGE);
bulk insert dbo.CompressedHeap_Destination
from 'E:\Data\HeapData.bcp' with (TABLOCK)
Dữ liệu được pagenén và cũng tại 69480 KB:
name rows reserved data index_size unused
CompressedHeap_Destination 6365530 69512 KB 69480 KB 8 KB 24 KB
BCP TRONG VỚI TABLOCK
Bạn có thể nhận được kết quả tương tự như BULK INSERT WITH TABLOCKbằng cách sử dụng BCP INvới -h "TABLOCK"gợi ý. Điều này có ý nghĩa, họ làm tương tự trong nội bộ
--bcp TEST.dbo.CompressedHeap_Destination2 IN E:\Data\HeapData.bcp -c -T -h "TABLOCK"
Với kích thước kết quả là 69480 KB
BCP KHÔNG CÓ TABLOCK
Sử dụng BCP để tải dữ liệu từ cùng một tệp trong bản sao của bảng đích
Và một lệnh bcp tiêu chuẩn dẫn đến dữ liệu không được nén:
--bcp TEST.dbo.CompressedHeap_Destination2 IN E:\Data\HeapData.bcp -c -T
Với kích thước dữ liệu tại 132272 KB(hàng nén).