@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 PAGE
né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 PAGE
nén khi chèn vào một đống, thêm -h "TABLOCK"
vào bcp
lệnh của bạn để có được nén.
ROW
né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 ROW
nén và không nén kích thước
Kích thước dữ liệu là 132272 KB
khi thực hiện chèn tiêu chuẩn vào heap, đây là ROW
nén nhưng không được PAGE
nén.
Kích thước dữ liệu mà không có bất kỳ nén là ~ 176216 KB
cho 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 TABLOCK
cho chúng ta PAGE
kí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 page
né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 page
né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 TABLOCK
bằng cách sử dụng BCP IN
vớ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).