Bên trong các chỉ mục Columnstore của SQL Server 2012

Lưu trữ dạng cột (COLUMNSTORE) thiết lập chính nó như một lựa chọn trên thưc̣ tế cho các lữu trữ BI. Lưu trữ dựa trên dòng truyền thống (ROWSTORE) của hệ quản trị cơ sở dữ liệu quan hệ phục vụ cho mục đích các xử giao tác trực tuyến (OLTP) và nó sẽ gặp vấn đề khi phải thưc̣ thi trên một khối lượng dữ liệu để phân tích phục vụ cho bài toán BI. Vậy cụ thể lưu trữ theo dạng cột là gì, nó có gì đặc biệt và chúng ta triển khai đánh chỉ mục nó như thế nào với tính năng mới này trong SQL Server 2012?

Columnstore

COLUMNSTORE là khả năng đọc các giá trị của một cột nào đó trên một bảng mà không cần phải đọc các giá trị của tất cả các cột. Trong kiểu ROWSTORE thì điều này là không th̉ê, bởi vì các giá trị của một cột được nhóm lại và lưu trữ vật lý trong các dòng trên các trang, và vì thế chúng ta phải đọc một trang khi muố́n lấy một gía trị của cột, nghĩa là chúng ta phải duyệt qua toàn bộ trang trong bộ nhớ hay nói cách khác “phải đọc tất cả các cột trong một dòng”:

clip_image002

Hình trên minh họa khi bạn muốn đọc các giá trị của cột A, chúng ta phải tốn thời gian cho việc đọc các cột không cần thiết khác như B, C, D và E, đơn giản bời vì do định dạng vật lý của bản ghi và trang. Nếu bạn chưa rõ về định dạng bản ghi, tôi đề nghị bạn nên đọc bài sau của Paul Randal Inside the Storage Engine: Anatomy of a Record.

Ngược lại COLUMNSTORE lưu trữ dữ liệu theo kiểu nhóm các cột lại với nhau trên đĩa, vì thế việc đọc các giá trị từ một cột chỉ ảnh hưởng rất nhỏ đến IO do thực tế nó chỉ đọc duy nhất một cột khi truy vấn:

clip_image004

Câu hỏi mà tôi thường gặp nhất là khi chúng ta sử dụng COLUMNSTORE thế thì một dòng sẽ được lưu trữ như thế nào? Nói một cách khác, nếu chúng ta lưu trữ các giá trị của một cột cùng nhau, thế thì làm sao chúng ta tái tạo lại một dòng dữ liệu? Tức là, nếu cột Name có các giá trị “John Doe’ và Joe Public’, trong khi cột Date_of_Birth lại chứa giá trị ’19650112′ và ’19680415′, thế John sinh ngày nào và Joe sinh ngày nào? Câu trả lời là tại vị trí của một giá trị trong một cột sẽ chỉ ra nó thuộc dòng nào. Vì thế, dòng 1 chứa giá trị đầu tiên của cột Name và cột Date_of_Birth, trong khi dòng 2 thì chứa giá trị thứ 2 trong mỗi cột, và cứ thế…

Bằng cách chia riêng biệt các giá trị từ các cột vào trong các trang, khi đó hệ thống chỉ đọc các cột cần thiết. Điều này sẽ làm giảm tần suất IO khi thực thi các câu truy vấn:

  • Chỉ đọc một tập nhỏ các cột của một bảng chứ không đọc tất cả các cột (không SELECT *)
  • Đọc rất nhiều dòng (các thao tác quét và các dãy quét)

Không có gì ngạc nhiên cả, đây là kiểu của các câu truy vấn trong mô hình truy vấn điển hình trong BI. Lưu ý rằng một cột được xem như như là để ‘đọc’ không chỉ đơn thuần là được dự kiến trong một tập kết quả trả về mà còn phải được xem như một tham chiếu trong mạnh đề WHERE, hay một điều kiện Join hay bất kỳ nơi nào khác trong một câu truy vấn. Các truy vấn điển hình trong BI là tập hợp các giá trị trong bảng dữ kiện (fact) thông qua một phạm vi lớn dữ liệu được định nghĩa bởi các tậc con các chiều (diemnsion) (ví dụ: tổng doanh thu của vùng Đông Bắc trong tháng 9, 10 hay trong một thời kỳ) và do đó chúng ta sẽ có xu hướng tạo các truy vấn chính xác trên các cột cần thiết. Thực tế là BI sử dụng các câu truy vấn tham chiếu trên một vài cột và nhiều dòng, phối hợp với khả năng của COLUMNSTORE để chỉ đọc các cột tham chiếu cần thiết trong câu truy vấn và đây là lợi thế đầu tiên của kỹ thuật COLUMNSTORE.

COLUMNSTORE chỉ đọc các cột tham chiếu bởi câu truy vấn

Ngược lại, đối với các xử lý trong OLTP, nó có xu hướng đọc toàn bộ dòng (tất cả các cột) và chỉ một hoặc một vài dòng tại một thời điểm. COLUMNSTORE không có giá trị trong trường hợp này và thưc̣ tế là nó có thể chậm hơn so với kiểu ROWSTORE đối với những xử lý OLTP.

Các bạn đọc thêm trên liên kết sau: http://rusanu.com/2012/05/29/inside-the-sql-server-2012-columnstore-indexes/

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: