Sử dụng Partition trong sqlserver với bảng trên thì set pk và index sao cho hợp lý

Mục đích: Tăng tốc tốc độ truy vấn (vì dữ liệu những năm về sau thường gấp 1,5 -> 2 năm trước.

=== Bài toán: ===
Hiện tại em có 1 bảng có 50 triệu bản ghi. Bảng có cấu trúc như sau:

TABLE(
id bigint primary key,
insert_date datetime,
data1 text,
data2 text,

data30 text
)

Query báo cáo thường sẽ where theo insert_date. Và cx có search theo Id.

=== Đề xuất: ===

Em áp dụng partition table theo tháng năm với trường insert_date (2020-01-01, 2020-02-01, … -> 2030-12-01).

=== Thắc mắc ===

Case 1: Em định sửa PK thành (insert_date) và add non-clustered index cho trường id.

Case 2: Em sửa sửa PK thành (insert_date, id) và add non-clustered index cho trường id.

Case 3: Em sửa sửa PK thành (id, insert_date) và add non-clustered index cho trường insert_date.

Mong mọi người đưa ra ý kiến và giải đáp cho thắc mắc của em ạ.
Chân thành cảm ơn.

Nếu có 1 bảng thì tại sao lại phải chọn MSSQL mà không phải NoSQL? Nên khả năng là còn các bảng khác, vậy thì tại sao có thể khẳng định là tại query ở bảng trên kia mới lâu? Mà lâu là lâu do đâu? Đọc data nhiểu? tính toán nhiều? hay là net bandwidth… Mặc dù tiêu đề ghi là “cụ thể” đó, nhưng cái cần cụ thể thì cũng chẳng thấy đâu cả :upside_down_face:

@Stanley00

vd trường hợp trên khi lên đến 100tr bản ghi thì a query single table cũng chậm mà ( Query báo cáo thường sẽ where theo insert_date . Và cx có search theo Id) => em mới sử dụng partition để tăng tốc độ truy vấn ạ.
Trước mắt em muốn tăng query table trên ạ.

(theo em được biết thì bảng dù có index thì nếu bảng quá lớn thì cũng sẽ bị chậm ngay cả khi where trên index)

chi cần parrtiton và tạo index cho trường insert date là được

1 Like

nếu không chỉnh PK của bảng hiện tại mà add partition sẽ báo lỗi này á @nguyenhuuca

Partition columns for a unique index must be a subset of the index key error

Thử tạo parttion xong tạo Index trên partion đó

1 Like

Cái vấn đề ở đây là còn chưa biết problem là gì mà đi tìm solution thì tìm làm sao mà ra được.
Ít nhất bạn đã có câu trả lời cho mấy câu hỏi “khác” chưa? Hoặc nói cách khác, bạn đã EXPLAIN query chưa? Việc database bao nhiêu data nó có ảnh hưởng, nhưng ảnh hưởng của nó rất nhỏ so với “query của bạn invole bao nhiêu data”

3 Likes

Có lẽ em nhầm tiêu đề ạ. Ý chính của em là sử dụng partition trong sqlserver với bảng trên thì set pk và index sao cho hợp lý.

3 cách của bạn nhìn chung điều ổn. Vấn đền còn lại là kiểm định nó trên thực tế, lấy Execution plan với những câu query thường dùng để so sánh xem thực sự nó có xài index như mình nghĩ không ? Trong trường hợp lấy dữ liệu theo partition key, nó có thật sự query trên những parition mình cần hay query cả table?
Mật vấn đề nửa khi cân nhắc đến performance là đặt những partition gân nhất (thường xài) lên đỉa có tốc độ cao hơn, vd như SSD.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?