Các BIT
cột có cung cấp bất kỳ lợi thế về hiệu suất khi được sử dụng trong Chỉ mục của Clustered Clusterstore không? Tôi quan tâm đến bất kỳ lợi ích hiệu suất nào đạt được từ việc xác định một cột trong CCI BIT
thay vì BIGINT
, chẳng hạn. Tôi đang làm việc với SQL Server 2016.
Tôi có hiểu biết rất hạn chế về cách hoạt động của nén CCI, nhưng dựa trên những gì tôi đã đọc và một số thử nghiệm, có vẻ như kiểu dữ liệu (giới hạn ở các số chính xác lưu trữ toàn bộ số) thực sự không quan trọng khi nói đến nén cột . Ví dụ: nếu tôi chèn 10 nhóm hàng đầy đủ vào các bảng có BIGINT
các cột trái ngược với BIT
các cột, tôi sẽ không thấy sự khác biệt về kích thước giữa các nhóm hàng được nén. Đây là dữ liệu nguồn cho một bài kiểm tra:
DROP TABLE IF EXISTS dbo.CCI_BIT_TEST_SOURCE;
CREATE TABLE dbo.CCI_BIT_TEST_SOURCE (
ID1 BIGINT NOT NULL,
ID2 BIGINT NOT NULL,
ID_BIT BIT NOT NULL,
ID_BIGINT BIGINT NOT NULL,
INDEX CCI__CCI_BIT_TEST_SOURCE CLUSTERED COLUMNSTORE
);
INSERT INTO dbo.CCI_BIT_TEST_SOURCE WITH (TABLOCK)
SELECT
t.RN
, t.RN
, t.RN % 2
, t.RN % 2
FROM
(
SELECT TOP (10485760) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
CROSS JOIN master..spt_values t3
) t
OPTION (MAXDOP 1);
Chèn vào CCI với 8 BIT
cột mất trung bình 18729 ms thời gian CPU. Bảng có 56960 KB không gian dành riêng:
DROP TABLE IF EXISTS dbo.CCI_BIT;
CREATE TABLE dbo.CCI_BIT (
ID1 BIGINT NOT NULL,
ID2 BIGINT NOT NULL,
ID_BOOL_1 BIT NOT NULL,
ID_BOOL_2 BIT NOT NULL,
ID_BOOL_3 BIT NOT NULL,
ID_BOOL_4 BIT NOT NULL,
ID_BOOL_5 BIT NOT NULL,
ID_BOOL_6 BIT NOT NULL,
ID_BOOL_7 BIT NOT NULL,
ID_BOOL_8 BIT NOT NULL,
INDEX CCI__CCI_BIT CLUSTERED COLUMNSTORE
);
INSERT INTO dbo.CCI_BIT WITH (TABLOCK)
SELECT
ID1
, ID2
, ID_BIT
, ID_BIT
, ID_BIT
, ID_BIT
, ID_BIT
, ID_BIT
, ID_BIT
, ID_BIT
FROM dbo.CCI_BIT_TEST_SOURCE
OPTION (MAXDOP 1);
Chèn vào CCI với 8 BIGINT
cột mất trung bình 18531 ms thời gian CPU. Bảng có 56960 KB không gian dành riêng, giống như trước:
DROP TABLE IF EXISTS dbo.CCI_NO_BIT;
CREATE TABLE dbo.CCI_NO_BIT (
ID1 BIGINT NOT NULL,
ID2 BIGINT NOT NULL,
ID_BOOL_1 BIGINT NOT NULL,
ID_BOOL_2 BIGINT NOT NULL,
ID_BOOL_3 BIGINT NOT NULL,
ID_BOOL_4 BIGINT NOT NULL,
ID_BOOL_5 BIGINT NOT NULL,
ID_BOOL_6 BIGINT NOT NULL,
ID_BOOL_7 BIGINT NOT NULL,
ID_BOOL_8 BIGINT NOT NULL,
INDEX CCI__CCI_NO_BIT CLUSTERED COLUMNSTORE
);
INSERT INTO dbo.CCI_NO_BIT WITH (TABLOCK)
SELECT
ID1
, ID2
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
FROM dbo.CCI_BIT_TEST_SOURCE
OPTION (MAXDOP 1);
Chúng ta cũng có thể thấy điều này trong DMV của cửa hàng cột:
Có một số lợi thế khi sử dụng BIT
các cột trong CCI. Ví dụ, dữ liệu được tải vào các cửa hàng delta sẽ chiếm ít không gian hơn với BIT
các cột vì các cửa hàng delta về cơ bản là các đống không nén. Trong các kế hoạch truy vấn, công thức cho kích thước dữ liệu ước tính dựa trên các loại dữ liệu của các cột trái ngược với kích thước của bảng trên đĩa. Bảng có BIT
các cột có tổng kích thước dữ liệu là 250 MB và bảng có BIGINT
các cột có tổng kích thước dữ liệu là 880 MB. Trong một số trường hợp, kích thước ước tính 250 MB có thể dẫn đến một kế hoạch tốt hơn.
Có bất kỳ lợi ích hiệu suất nào khác của BIT
các cột cho CCI không? Hay các loại dữ liệu không thực sự quan trọng miễn là bạn đang sử dụng một số chính xác mà các cửa hàng số nguyên ( BIT
, TINYINT
, SMALLINT
, INT
, hoặc BIGINT
)?
BIT
. Vì vậy, bạn cần sử dụngCONVERT
để thực hiện tổng hợp như vậy và chuyển đổi đó ngăn chặn việc đẩy xuống tổng hợp. Nếu bạn cố gắng để có mộtMIN
trênID_BOOL_1
trên cả hai bảng của bạn, tôi nghĩ bạn sẽ thấy rằngBIGINT
phiên bản thực sự là nhanh hơn đáng kể vì lý do này!