Mục lục

Giới thiệu Partition Table

Trên thực tế, khi bạn làm việc với các database lớn, sẽ rất hay bắt gặp 1 loại bảng gọi là Partition Table, bên cạnh các bảng bình thường khác.

Partition Table là 1 giải pháp đối với những bảng lớn đến rất lớn, giúp tối ưu hiệu năng và công sức quản lý.

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 Partition Table nhé.

Đặt vấn đề

Một table bình thường (hay non partitioned), 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.

Partition Table là gì?

Partition 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:

Cấu trúc partition table

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.

Partition table nhìn ở góc độ khác

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

Như vậy, các bạn đã hiểu được mức độ quan trọng của Partition Table. Song, nếu Partition Table giúp tối ưu hiệu năng như vậy, sao chúng ta không mặc định tạo bảng ở dạng partition luôn đi.

Câu trả lời là: Không phải tình huống nào partition table cũng phát huy được ưu thế của mình!

Quay lại ví dụ bên trên, nếu câu lệnh truy vấn bây giờ là:

 

				
					select * from ban_hang where doanh_so > 1000000;
				
			

Điều kiện lọc dữ liệu không có đủ thông tin để RDBMS lựa chọn partition nào cần quét qua, do đó, partitioned table trong tình huống này không có tác dụng.

Dưới đây là 1 số hướng dẫn khi nào bạn nên cân nhắc 1 bảng nên được partition (Mình lấy theo tài liệu của Oracle):

https://docs.oracle.com/en/database/oracle/oracle-database/18/vldbg/partition-concepts.html#GUID-E849DE8A-547D-4A2E-9324-706CAF574754

  • Table có dung lượng từ 2GB trở lên nên cân nhắc được partition.
  • Table có chứa dữ liệu lịch sử. Dữ liệu cũ, ít được sử dụng sẽ đưa vào các partition cũ, những dữ liệu mới sẽ được đưa vào partition mới.
  • Table có nội dung có thể được chia thành các khu vực có mức độ ưu tiên khác nhau (VD: khu vực dành cho dữ liệu thường xuyên được truy vấn,hoặc ít được truy vấn, …)

Bạn có thể tham khảo bài viết dưới đây của tôi để biết cách chuyển 1 bảng không phải partition thành bảng partition nhé:

Đọc thêm  Chuyển bảng non-partition thành bảng partition bằng dbms_redefinition

Hi vọng các bạn đã hiểu về Partitioned Table sau bài viết này. Hẹn gặp lại các bạn vào các bài viết tiếp theo.

Nguồn: https://dangxuanduy.com/

Hiện tại, tôi có tổ chức đều đặn các khóa học về quản trị Oracle Database, tôi sẽ để thông tin ở đây, để bạn nào quan tâm về lịch học cũng như chương trình học có thể theo dõi nhé.

KHOÁ DÀNH CHO NGƯỜI MỚI

KHÓA HỌC: QUẢN TRỊ ORACLE DATABASE THẬT LÀ ĐƠN GIẢN (ADMIN 1) 

CÁC KHOÁ NÂNG CAO:

KHÓA HỌC ORACLE NÂNG CAO: QUẢN TRỊ KIẾN TRÚC MULTITENANT 12c

KHÓA HỌC ORACLE NÂNG CAO: QUẢN TRỊ HỆ THỐNG DATA GUARD

CÁC KHOÁ COMBO:

COMBO 1: ADMIN 1 + MULTITENANT 12c

COMBO 2: ADMIN 1 + DATA GUARD

COMBO 3: ADMIN 1 + MULTITENANT 12c + DATA GUARD

LỊCH HỌC:

Mời bạn xem tại đây: LỊCH HỌC CÁC LỚP ORACLE 

ĐĂNG KÝ:

https://forms.gle/MtCAoRQFenP886y79

Hãy tham gia group “Kho tài liệu kiến thức database” để cùng học hỏi và chia sẻ nhé.

5 3 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận
0
Rất thích suy nghĩ của bạn, hãy bình luận.x