Blog

Khi nào cần tạo Partition cho Cơ Sở Dữ Liệu Oracle

Chuỗi chủ đề tiếp theo chúng ta sẽ thảo luận về TABLE PARTITIONING trong Oracle. Đây có thể nói là 1 trong những điểm mạnh nhất của Oracle, Trong bài viết này, tôi sẽ giải thích cho các bạn lý do tại sao chúng ta cần đến Partitioned Table nhé.

>>>Đọc thêm:

Khoá học SQL – Truy vấn cơ sở dữ liệu từ cơ bản đến nâng cao

Lộ trình trở thành Data Engineer (Kỹ sư dữ liệu)

Đặt vấn đề

Oracle đã dựa trên câu chuyện bó đũa của Việt Nam để đưa ra tính năng tuyệt vời này: Tức là với bảng lớn (tương đương 10 cây đũa) thì rất khó chúng ta có thể thao tác, quản trị; nhưng khi chia thành những phần nhỏ chúng ta lại dễ dàng quản trị (bẽ gây đũa) được

Một table bình thường (hay non partitioned), bạn hình dung,  nó giống như 1 khối dữ liệu khi lưu trên ổ đĩa cứng.

Table càng lớn, thì khối dữ liệu cũng càng lớn, khiến cho các truy vấn trên khối dữ liệu đó cũng khó khăn và chậm chạp hơn.

Với bài toán này. có 2 cách xử lý chính để tối ưu hóa thời gian truy vấn:

  •    Đánh index cho bảng dựa trên 1 cột nào đó: Cách này rất hiệu quả nếu dữ liệu cần lấy là nhỏ so với tổng dữ liệu trong bảng. Tuy nhiên, dữ liệu tăng trưởng đến 1 mức độ nào đó, cách xử lý này cũng sẽ giảm dần hiệu quả. (do bản thân index cũng sẽ lớn theo dữ liệu thực sự)
  •    Chia để trị (hay partitioning): Với cách này, từ 1 khối dữ liệu to ban đầu, chúng ta sẽ chia nhỏ nó ra thành các khối nhỏ hơn, để tiện cho việc quản lý. Hay nói 1 cách khác, chúng ta đã partition bảng ban đầu!

Và đó chính là chủ đề của bài viết này

Partitioned Table là gì?

Partitioned Table là 1 bảng đã được chia nhỏ thành các phần (hay các partition) theo 1 cột nào đó trong bảng.

Ví dụ như sau:

Table Ban_hang có cấu trúc như sau:

Nếu như bây giờ tôi thực hiện câu lệnh sau:

select * from ban_hang where cua_hang='A1' and thang='Jan 2021';

Để tìm được các dòng dữ liệu có cột cua_hang=’A1′ và thang=’Jan 2021′, RDBMS sẽ cần quét toàn bộ bảng để lấy ra các dòng thỏa mãn điều kiện.

Trong ví dụ trên, sẽ có 5 dòng dữ liệu cần phải quét qua. Nếu bảng lớn, thời gian này sẽ rất lâu.

Bằng cách chia nhỏ bảng Ban_hang ra theo 1 tiêu chí (hay 1 cột) mà chúng ta chọn, vấn đề này sẽ được giải quyết!

Chú ý: Cột được lựa chọn là tiêu chí để chia nhỏ bảng, ta gọi đó là partition key

Giả sử, chúng ta chia bảng theo cột Cua_hang (partition key là Cua_hang) thì bảng sẽ có 4 phần: A1, A2, A3, A4 tương ứng với 4 partition

partitioned table 2

Như vậy, câu lệnh:

select * from ban_hang where cua_hang='A1' and thang='Jan 2021';

sẽ chỉ cần quét dữ liệu của Partition 1 thôi. Chỉ còn 2 dòng cần quét qua, so với 5 dòng như trước khi bảng được partition. Nhanh hơn nhiều phải không?

Còn nếu chúng ta chia bảng theo cột Thang (partition key là Thang) thì sẽ có các partition như sau:

partitioned table 3

Cũng tương tự như vậy, chỉ có 1 partition (hay 2 dòng dữ liệu) được quét qua, thay vì toàn bộ bảng.

Nhìn ở góc độ vật lý, bảng non-partition và partition trông sẽ như thế này.

Khi nào bảng nên được partition?

Vậy khi nào chúng ta cần tạo partition cho CSDL Oracle?

Theo khuyến cáo của Oracle thì chúng ta cần cân nhắc tạo partition cho bảng khi:

  • Khi bảng lớn hơn 2GB
  • Bảng có dữ liệu lịch sử: Chỉ cần DML trong tháng hiện tại (VD tháng 10/2019), còn lại trước đó Read Only
  • Bảng chứa nhiều partition phân tán trên các phân vùng đĩa khác nhau (như SSD, FC, SAS, SATA) khi đó sẽ được lưu trên các tablespace tương ứng (như DATA2019, DATA2018, DATA2017,…)
  • Còn 1 nội dung nữa mà Oracle không đưa ra trong phần lý thuyết đó là: Thực tế câu lệnh SELECT của chúng ta hay sử dụng quét theo điều kiện gì (theo ngày, theo tháng, theo quý hay theo năm) để chúng ta quyết định loại partition cho phù hợp

Trên đây là quan điểm của mình và 3 khuyến cáo đầu là của Oracle.

Lựa chọn kiểu partition gì?

  • Với dữ liệu lịch sử thì đánh theo By Range.
  • Với dữ liệu xác định trước được giá trị thì đánh theo By list.
  • Với dữ liệu không có quy luật thì đánh theo By Hash.

>>>Đọc thêm:

Khoá học SQL – Truy vấn cơ sở dữ liệu từ cơ bản đến nâng cao

Lộ trình trở thành Data Engineer (Kỹ sư dữ liệu)

    LIÊN HỆ VỚI CHÚNG TÔI ĐỂ NHẬN ĐƯỢC TƯ VẤN MIỄN PHÍ
    Xin vui lòng điền vào form dưới đây. Chúng tôi sẽ liên hệ lại ngay cho bạn khi nhận được thông tin:






    Leave a Reply

    Your email address will not be published. Required fields are marked *