Mã tạo chỉ mục cột phân cụm trong khi duy trì thứ tự hàng


8

Tôi muốn chuyển đổi một bảng lưu trữ thành một bảng lưu trữ cột bằng cách tạo một chỉ mục cột lưu trữ cụm. Có ba cột trong bảng: id, thời gian và giá trị.

Bảng được sắp xếp theo id và thời gian trước khi tạo chỉ mục cột; tuy nhiên, sau khi tạo chỉ mục cột, thứ tự hàng bị rối tung. Tôi nghĩ rằng nó có thể là do sự song song và thêm maxdop = 1tùy chọn, nhưng điều đó không khắc phục được vấn đề. Bất cứ ai có thể giúp tôi với điều này?

Dưới đây là mã tạo bảng và chỉ mục:

-- creating rowstore table
drop table if exists tab1_rstore
select id, time, value
into tab1_rstore
from tab0
order by id_loan, period
option(maxdop 1)

-- creating clustered index on rowstore table
create clustered index idx on tab1_rstore (id,time)

-- creating columnstore table 
select * 
into tab1_cstore
from tab1_rstore
    option(maxdop 1)

-- comparing the first two rows from these two tables
    select top 2 *
from tab1_rstore

    select top 2 *
from tab1_cstore

Ảnh chụp màn hình kết quả truy vấn:

Hai hàng đầu trước chỉ mục c

-- creating clustered columnstore index
create clustered columnstore index idx on tab1_cstore 
with (maxdop = 1) 

-- comparing the top two rows again
select top 2 *
from tab1_rstore

select top 2 *
from tab1_cstore

Ảnh chụp màn hình kết quả truy vấn với chỉ mục cột:

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

Tôi hiểu rằng thứ tự của các hàng được xác định bởi thuật toán nén và chúng tôi không thể làm gì về nó, xem giới hạn và hạn chế trong tài liệu ở đây với trích dẫn sau:

Không thể bao gồm các từ khóa ASC hoặc DESC để sắp xếp chỉ mục. Các chỉ mục của cột được sắp xếp theo các thuật toán nén. Sắp xếp sẽ loại bỏ nhiều lợi ích hiệu suất.

Tôi đang sử dụng SQL Server 2016 Developer Edition trên Windows 10 64bit.

Câu trả lời:


14

Một chỉ mục cửa hàng cột được phân nhóm về cơ bản khác với một chỉ mục cửa hàng được phân cụm. Bạn có thể nhận thấy rằng không có đặc điểm kỹ thuật cột chính cho một chỉ mục cửa hàng cột cụm. Đúng vậy: một chỉ mục cửa hàng cột được phân cụm là một chỉ mục không có khóa - tất cả các cột đều được 'bao gồm'.

Mô tả trực quan nhất mà tôi đã nghe cho một chỉ mục của cửa hàng cột được nhóm là nghĩ về nó như một bảng heap hướng theo cột (trong đó 'RID' rowgroup_id, row_number).

Nếu bạn cần các chỉ mục để hỗ trợ đặt hàng trực tiếp và / hoặc lựa chọn điểm / phạm vi nhỏ, bạn có thể tạo các chỉ mục b-cây của hàng lưu trữ có thể cập nhật trên đầu trang của cột lưu trữ được phân cụm trong SQL Server 2016.

Trong nhiều trường hợp, điều này đơn giản là không cần thiết , vì truy cập cột và sắp xếp chế độ hàng loạt quá nhanh. Nhiều điều mọi người 'biết' về hiệu suất của cửa hàng cần phải được học lại cho nhà hàng cột. Quét và băm là tốt :)

Điều đó nói rằng, tất nhiên cột cửa hàng có cấu trúc cho các nhóm hàng của nó (và siêu dữ liệu về các giá trị tối thiểu / tối đa trong mỗi phân đoạn), có thể hữu ích trong các truy vấn có thể có lợi từ việc loại bỏ nhóm / phân khúc hàng.

Một kỹ thuật quan trọng trong lĩnh vực này là trước tiên tạo một chỉ mục cửa hàng được phân cụm với thứ tự mong muốn, sau đó tạo chỉ mục cột phân cụm bằng cách sử dụng WITH (DROP_EXISTING = ON, MAXDOP = 1)tùy chọn. Trong ví dụ của bạn:

CREATE [UNIQUE] CLUSTERED INDEX idx 
ON dbo.tab1_cstore (id, time)
WITH (MAXDOP = 1);

CREATE CLUSTERED COLUMNSTORE INDEX idx 
ON dbo.tab1_cstore
WITH (DROP_EXISTING = ON, MAXDOP = 1);

Chăm sóc là cần thiết để duy trì lợi ích của việc loại bỏ nhóm / phân khúc hàng theo thời gian. Ngoài ra, trong khi cột lưu trữ đã được phân vùng ngầm theo nhóm hàng, nhưng bạn cũng có thể phân vùng rõ ràng.

Tôi không chắc chắn 100% những gì bạn đang muốn kiểm tra, nhưng sự thật là 'thứ tự' của các giá trị trong một phân đoạn được xác định bởi thuật toán nén. Quan điểm của tôi về việc tạo chỉ mục của cột DROP_EXISTINGlà về thứ tự dữ liệu chảy vào quy trình tạo phân khúc, do đó, các phân đoạn tổng thể sẽ được sắp xếp theo một cách cụ thể. Trong phân khúc, tất cả các cược đã tắt.


2

Bên cạnh đó, tôi tin rằng Nhóm Tiger Server của SQL nhận thức được sự cần thiết của một ORDER BYmệnh đề hoặc tương tự trên các bản dựng chỉ mục của cột để tối đa hóa cơ hội loại bỏ nhóm hàng.

Ngoài ra, tại thời điểm này, điều rất quan trọng là đảm bảo, như trong một câu trả lời khác ở đây, rằng bạn sử dụng MAXDOP = 1khi xây dựng chỉ mục cột. Nếu bạn không, bạn sẽ khiến việc phân vùng dữ liệu thành nhiều luồng về cơ bản làm giảm đáng kể khả năng loại bỏ nhóm hàng hiệu quả nhất.

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.