Chuyển đến nội dung chính

Materialized Views trong PostgreSQL

Tìm hiểu cách lưu trữ kết quả của một truy vấn với sự hỗ trợ của materialized view trong PostgreSQL.
· 6 phút đọc

Khám phá cùng AI

Nếu bạn làm việc nhiều với SQL (ưu tiên là người dùng PostgreSQL) ở mức chuyên sâu hoặc trung bình để truy vấn cơ sở dữ liệu, rất có thể bạn đã viết không ít truy vấn phức tạp để trả lời những câu hỏi quan trọng. Đôi khi bạn cũng cần dùng kết quả của những truy vấn đó khá thường xuyên trong công việc. Việc chạy lặp lại một truy vấn phức tạp có thể tốn kém. Sẽ thế nào nếu có cách lưu đệm (cache) kết quả của một truy vấn phức tạp để cải thiện hiệu năng? Materialized view chính là dành cho bạn.

Bạn có thể nghĩ rằng cũng có các view đơn giản có thể lưu kết quả của một truy vấn. Nhưng một view đơn giản khác với materialized view ở nhiều khía cạnh. Đây là điều mà tài liệu chính thức của PostgreSQL nói về view đơn giản -

View không được vật chất hóa một cách vật lý. Thay vào đó, truy vấn sẽ được chạy mỗi khi view được tham chiếu trong một truy vấn.

Tuyên bố này có nghĩa là các view đơn giản không được lưu trữ vật lý trong cơ sở dữ liệu. Mỗi lần một view được dùng trong một truy vấn, truy vấn đã tạo ra view đó sẽ được thực thi. Điều này khiến view đơn giản kém hiệu quả hơn về thời gian truy cập.

Mặt khác, materialized view mang lại nhiều linh hoạt bằng cách cho phép bạn lưu trữ một view một cách vật lý trong cơ sở dữ liệu. Và bạn có thể thao tác với materialized view giống như với view đơn giản (nhưng với thời gian truy cập thấp hơn). Trong phần còn lại của hướng dẫn này, bạn sẽ tìm hiểu về materialized view trong PostgreSQL. Trong một hội thảo trực tuyến, Chief Data Scientist của DataCamp, David Robinson, đã cho thấy cách ông sử dụng materialized view để lưu trữ hiệu quả kết quả của các truy vấn phức tạp.

Lưu ý để theo dõi hướng dẫn này, bạn nên quen thuộc với nội dung được đề cập trong khóa học Joining Data in SQL.

Thiết lập cơ sở dữ liệu ban đầu

Tốt hơn hết là bạn thiết lập một cơ sở dữ liệu trong PostgreSQL và tạo một bảng cơ bản để có thể truy vấn hiệu quả. Điều này cũng sẽ hữu ích ở các phần sau của hướng dẫn. Bạn có thể khôi phục bản sao lưu cơ sở dữ liệu này chứa bảng sẽ được dùng trong hướng dẫn. Nếu muốn học cách khôi phục bản sao lưu cơ sở dữ liệu trong PostgreSQL, bạn có thể theo dõi phần đầu của hướng dẫn này.

Nếu bạn đã khôi phục được bản sao lưu, bạn sẽ thấy một bảng tên là international_debt trong cơ sở dữ liệu (bạn sẽ cần tạo một cơ sở dữ liệu trước nếu chưa có). Hãy nhanh chóng xem vài dòng đầu của bảng (một truy vấn select đơn giản sẽ giúp bạn làm điều này) -

database

Bảng chứa thông tin về thống kê nợ của các quốc gia trên toàn cầu trong năm hiện tại theo các nhóm khác nhau (tham chiếu các cột indicator_name, indicator_code). Cột debt cho biết số nợ (tính bằng USD) một quốc gia có trong một nhóm cụ thể. Dữ liệu thuộc lĩnh vực kinh tế và thường được dùng để phân tích tình hình kinh tế của các quốc gia. Dữ liệu được thu thập từ Ngân hàng Thế giới.

Bây giờ bạn đã thiết lập cơ sở dữ liệu thành công, hãy tiếp tục sang các phần tiếp theo của hướng dẫn.

Tạo Materialized View

Hãy tạo một materialized view từ truy vấn sau -

select country_name,
sum(debt) as total_debt
from international_debt
group by country_name order by country_name;

Truy vấn trả về tên các quốc gia cùng tổng số nợ của họ (theo thứ tự bảng chữ cái). Kết quả truy vấn sẽ trông như sau -

Bây giờ là materialized view -

CREATE MATERIALIZED VIEW country_total_debt
as
  select country_name,
  sum(debt) as total_debt
  from international_debt
  group by country_name order by country_name;

Bạn sẽ nhận được thông báo thành công như sau - Query returned successfully: 124 rows affected, 242 ms execution time.

Làm mới Materialized View

Bạn cũng có thể yêu cầu PostgreSQL không nạp bất kỳ dữ liệu nào vào materialized view khi tạo bằng cách chỉ định tùy chọn WITH NO DATA -

CREATE MATERIALIZED VIEW country_total_debt_2
as
  select country_name,
  sum(debt) as total_debt
  from international_debt
  group by country_name order by country_name
WITH NO DATA;

Bạn sẽ nhận được thông báo - Query returned successfully with no result in 41 ms. Hãy để ý sự khác biệt giữa hai thông báo. Nếu bạn thêm tùy chọn WITH NO DATA, một materialized view trống sẽ được tạo. Bạn không thể truy vấn materialized view này. Tuy nhiên, bạn có thể nạp dữ liệu cho materialized view bằng cách thực thi -

REFRESH MATERIALIZED VIEW country_total_debt_2;

Truy vấn Materialized View

Đến lúc này, bạn đã có hai materialized view (country_total_debt, country_total_debt_2) được tạo. Hãy chạy một truy vấn select đơn giản với một trong hai -

select * from country_total_debt_2;

Truy vấn sẽ trả về kết quả như sau -

query

Kết quả đầu ra giống hệt truy vấn mà chúng ta đã bao gói trong materialized view. Bạn cũng có thể chạy truy vấn trên materialized view với các hàm tổng hợp -

select max(total_debt) from country_total_debt_2;

Bạn sẽ nhận được - output

Xóa Materialized View

Materialized view có thể được xóa tương tự như cách xóa bảng trong PostgreSQL. Bạn chỉ cần chỉ định Materialized View sau Drop -

Drop Materialized View country_total_debt_2;

Để so sánh MySQL với đối thủ phổ biến thứ hai, hãy xem bài so sánh chi tiết PostgreSQL vs. MySQL của chúng tôi.

Kết luận

Đó là tất cả cho hướng dẫn này. Cảm ơn bạn đã đọc đến cuối. Trong hướng dẫn này, bạn đã học về materialized view trong PostgreSQL và cách thao tác với chúng. Nhờ tính hiệu quả, materialized view được sử dụng rộng rãi trong kho dữ liệu (data warehousing). Nếu bạn quan tâm học các truy vấn phức tạp hơn, hãy xem các khóa học DataCamp sau:

Chủ đề

Liên quan