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

Materialized View trong SQL: Nâng cao hiệu năng truy vấn

Tìm hiểu cách materialized view cải thiện hiệu năng truy vấn trong cơ sở dữ liệu SQL. Nắm rõ hạn chế và thực hành tốt nhất trên các hệ cơ sở dữ liệu khác nhau.
· 9 phút đọc

Khám phá cùng AI

Materialized view là một tính năng mạnh mẽ trong các hệ quản trị cơ sở dữ liệu SQL, giúp tối ưu hiệu năng truy vấn bằng cách lưu trữ vật lý kết quả của một truy vấn trên đĩa, từ đó tăng tốc độ truy vấn nhờ giảm việc tính toán lại. Điều này đặc biệt hữu ích khi xử lý các truy vấn phức tạp, tốn tài nguyên, bao gồm join, tổng hợp và các tập dữ liệu lớn.

Trước khi bắt đầu, tôi khuyến nghị bạn học khóa Introduction to SQL và lộ trình kỹ năng SQL Fundamentals trên DataCamp để nắm vững các kiến thức cơ bản về SQL và cách trích xuất dữ liệu bằng truy vấn. Tờ SQL Basics Cheat Sheet cũng sẽ là tài liệu hữu ích cho các hàm SQL thường dùng trong lọc và tổng hợp dữ liệu.

SQL Materialized View là gì?

Materialized view là một loại đối tượng đặc biệt trong cơ sở dữ liệu, lưu trữ vật lý kết quả của một truy vấn thay vì tính toán theo thời gian thực như view thông thường. Trong khi view thông thường là một câu truy vấn SQL được lưu lại và tạo kết quả động mỗi lần được gọi, materialized view sẽ tính trước và lưu dữ liệu theo cấu trúc giống bảng.

Bằng cách lưu bộ kết quả trên đĩa, materialized view có thể giảm đáng kể tải cho cơ sở dữ liệu, cải thiện hiệu năng truy vấn và hợp lý hóa việc xử lý các phép tính nặng.

Tạo Materialized View trong SQL

Quy trình tạo materialized view sử dụng cú pháp CREATE MATERIALIZED VIEW, có khác biệt đôi chút giữa các hệ quản trị SQL. Các phương pháp sau minh họa cách tạo materialized view trong SQL Server, PostgreSQL và Oracle.

Materialized view trong PostgreSQL

Trong PostgreSQL, bạn có thể tạo materialized view bằng cú pháp sau. Ví dụ này tạo một materialized view tên sales_summary để tổng hợp tổng số lượng và doanh thu của từng sản phẩm.

-- Create a materialized view to summarize sales data
CREATE MATERIALIZED VIEW sales_summary AS
SELECT product_id, 
       SUM(quantity) AS total_quantity, 
       SUM(price * quantity) AS total_revenue
FROM sales
GROUP BY product_id;

Materialized view trong SQL Server

Trong SQL Server, materialized view được gọi là "Indexed Views." Các bảng nền phải đáp ứng những yêu cầu cụ thể để tạo indexed view, chẳng hạn bật tùy chọn WITH SCHEMABINDING.

Tùy chọn WITH SCHEMABINDING đảm bảo lược đồ không thể thay đổi khi indexed view đang tồn tại. Cần tạo một unique clustered index để view có thể được materialized.

-- Create an indexed view with schema binding to summarize sales data
CREATE VIEW sales_summary
WITH SCHEMABINDING 
AS
SELECT product_id, 
       COUNT_BIG(*) AS record_count,
       SUM(ISNULL(quantity, 0)) AS total_quantity,
       SUM(ISNULL(price, 0) * ISNULL(quantity, 0)) AS total_revenue
FROM sales
GROUP BY product_id;
GO
-- Create a unique clustered index to materialize the view
CREATE UNIQUE CLUSTERED INDEX IX_sales_summary 
ON sales_summary (product_id);
GO

Nếu bạn muốn tìm hiểu thêm về SQL Server, tôi khuyến nghị xem lộ trình kỹ năng SQL Server Fundamentals để làm quen với các kỹ năng SQL phục vụ phân tích dữ liệu.

Materialized view trong Oracle

Cú pháp tạo materialized view trong Oracle tương tự như PostgreSQL. Chúng ta cũng có thể chỉ định tùy chọn làm mới, như ON DEMAND hoặc ON COMMIT.

-- Create a materialized view to summarize sales data
CREATE MATERIALIZED VIEW sales_summary
BUILD IMMEDIATE
REFRESH FAST ON DEMAND
AS
SELECT product_id, SUM(quantity) AS total_quantity, SUM(price * quantity) AS total_revenue
FROM sales
GROUP BY product_id;

Materialized view trong cơ sở dữ liệu phân tán

Materialized view cũng có thể chỉ định phương thức phân phối dữ liệu để đạt hiệu năng tốt hơn đối với các hệ như Azure Synapse hoặc Amazon Redshift hỗ trợ kho dữ liệu phân tán.

Hash Distribution cho Amazon Redshift

Truy vấn dưới đây tạo một materialized view tên sales_summary để tổng hợp tổng số lượng và doanh thu theo product_id. Tùy chọn DISTSTYLE KEY và DISTKEY(product_id) đảm bảo dữ liệu được phân phối trên các nút dựa trên product_id, cải thiện hiệu năng cho các truy vấn join theo cột này.

-- Create a materialized view with key-based distribution for efficient joins
CREATE MATERIALIZED VIEW sales_summary
DISTSTYLE KEY
DISTKEY(product_id)
AS
SELECT product_id, 
       SUM(quantity) AS total_quantity, 
       SUM(price * quantity) AS total_revenue
FROM sales
GROUP BY product_id;

Round-Robin Distribution cho Azure Synapse

Truy vấn này tạo một materialized view tên sales_summary để tổng hợp tổng số lượng và doanh thu theo product_id. Phân phối ROUND_ROBIN trải đều dữ liệu qua các nút, hữu ích cho các tình huống không phụ thuộc nhiều vào join.

-- Create a materialized view with round-robin distribution for balanced data storage
CREATE MATERIALIZED VIEW sales_summary
WITH (DISTRIBUTION = ROUND_ROBIN)
AS
SELECT product_id, 
       SUM(quantity) AS total_quantity, 
       SUM(price * quantity) AS total_revenue
FROM sales
GROUP BY product_id;

Làm mới Materialized View trong SQL

Dữ liệu trong materialized view có thể được làm mới để cập nhật theo các bảng nền. Lựa chọn phương thức làm mới phụ thuộc vào yêu cầu nghiệp vụ và cân nhắc hiệu năng của từng hệ cơ sở dữ liệu. Hãy cùng xem các phương thức làm mới của materialized view dưới đây.

Làm mới thủ công

Với làm mới thủ công, materialized view chỉ được làm mới khi người dùng chủ động yêu cầu. Cách này cho phép kiểm soát tối đa thời điểm cập nhật dữ liệu, phù hợp khi dữ liệu ít thay đổi hoặc cập nhật vào giờ thấp điểm.

Truy vấn sau minh họa cách làm mới thủ công trong PostgreSQL.

REFRESH MATERIALIZED VIEW sales_summary;

Làm mới định kỳ

Materialized view được tự động làm mới ở các khoảng thời gian định sẵn, đảm bảo dữ liệu được cập nhật mà không cần can thiệp của người dùng. Cách này hữu ích cho các ứng dụng nhạy thời gian cần dữ liệu tương đối mới.

Ví dụ dưới đây cho thấy cách thiết lập làm mới định kỳ trong Oracle bằng cách định nghĩa lịch làm mới trực tiếp trong câu lệnh CREATE MATERIALIZED VIEW. Thời gian làm mới được đặt theo chu kỳ hàng giờ.

-- Create a materialized view to aggregate sales data
-- Set to refresh completely every hour
CREATE MATERIALIZED VIEW sales_summary
REFRESH COMPLETE START WITH (SYSDATE) NEXT (SYSDATE + 1/24)
AS
SELECT product_id, 
       SUM(quantity) AS total_quantity, 
       SUM(price * quantity) AS total_revenue
FROM sales
GROUP BY product_id;

Làm mới theo yêu cầu

Làm mới theo yêu cầu xảy ra mỗi khi dữ liệu nền thay đổi, thường thông qua cơ chế trigger. Cách này đảm bảo materialized view luôn chứa dữ liệu đã cập nhật. Ví dụ, trong PostgreSQL, có thể thiết lập trigger để làm mới view khi có thay đổi ở bảng nền.

Làm mới toàn phần so với tăng dần

Bạn có thể làm mới dữ liệu toàn phần hoặc theo kiểu tăng dần trong materialized view. Bảng sau tóm tắt hai phương thức và tình huống sử dụng.

Loại làm mớiMô tảƯu điểmNhược điểm
Làm mới toàn phầnNạp lại toàn bộ tập dữ liệu, thay thế mọi dữ liệu hiện có trong view- Dễ triển khai
- Xây dựng lại toàn bộ view
- Tốn nhiều tài nguyên với tập dữ liệu lớn
- Thời gian làm mới lâu hơn
Làm mới tăng dầnChỉ cập nhật các phần dữ liệu thay đổi trong view- Hiệu quả hơn, chỉ xử lý dữ liệu đã thay đổi
- Phù hợp với tập dữ liệu lớn, thay đổi thường xuyên
- Cần thiết lập bổ sung (ví dụ: log theo dõi thay đổi)
- Không phải lúc nào cũng được hỗ trợ cho mọi truy vấn

Thực hành tốt nhất cho Materialized View

Khi sử dụng materialized view, cần cân nhắc các thực hành sau để tối ưu.

  • Chọn đúng truy vấn để materialize: Materialize các truy vấn phức tạp, tốn tài nguyên như join, tổng hợp và truy vấn lồng. Những truy vấn này hưởng lợi từ kết quả tính trước, giảm tải cho cơ sở dữ liệu.
  • Cân bằng giữa độ mới của dữ liệu và hiệu năng: Tùy trường hợp sử dụng, chọn chiến lược làm mới phù hợp như thủ công, định kỳ hoặc theo yêu cầu. Dùng làm mới tăng dần để giảm tải tính toán và theo dõi tần suất thay đổi dữ liệu để quyết định chu kỳ làm mới.
  • Dùng materialized view để tối ưu khối lượng công việc nặng truy vấn: Tận dụng materialized view cho báo cáo BI và dashboard nơi thời gian phản hồi nhanh là thiết yếu. Bạn cũng có thể đánh chỉ mục các cột dùng trong materialized view để lọc và sắp xếp nhanh hơn.

Materialized View trong các hệ quản trị cơ sở dữ liệu khác nhau

Như bạn đã thấy, các hệ quản trị cơ sở dữ liệu cung cấp mức hỗ trợ khác nhau cho materialized view. Bảng sau tóm tắt các tính năng và hạn chế riêng của materialized view trong các hệ này.

Hệ cơ sở dữ liệuPhương thức làm mớiLàm mới tăng dầnTự động làm mớiTính năng/Hạn chế đặc thù
PostgreSQLThủ công (REFRESH MATERIALIZED VIEW)KhôngKhôngThiếu làm mới tăng dần gốc. Cần lập lịch thủ công.
SQL ServerTự động (Indexed Views)Có (Đồng bộ tự động)Có

Yêu cầu WITH SCHEMABINDING. Hỗ trợ truy vấn có giới hạn.

OracleThủ công, On Commit, Lập lịchCó (Fast Refresh)CóHỗ trợ làm mới nhanh, phân vùng và song song. Cần view log.
Amazon RedshiftThủ công, Lập lịchCóCóHỗ trợ dữ liệu phân tán theo hash hoặc round-robin.
MySQLKhông hỗ trợ gốcKhôngKhôngCần giải pháp thay thế (ví dụ: bảng tạm, công cụ bên thứ ba).
Azure SynapseThủ công, Lập lịchCóCóCho phép các chiến lược phân phối khác nhau để tối ưu.

Nếu bạn dùng SQL Server làm hệ cơ sở dữ liệu chính, tôi khuyến nghị học khóa Introduction to SQL Server của DataCamp để nắm vững nền tảng Microsoft SQL Server cho phân tích dữ liệu. Ngoài ra, hãy xem lộ trình nghề nghiệp SQL Server Developer để hiểu cách tối ưu truy vấn và xử lý sự cố trong SQL Server.

Những điều cần cân nhắc thêm

Dù materialized view trong SQL hữu ích cho tối ưu truy vấn, chúng cũng đi kèm thách thức và hạn chế. Dưới đây là các vấn đề thường gặp và cách xử lý.

  • Chi phí lưu trữ: Materialized view lưu trữ vật lý kết quả truy vấn trên đĩa, làm tăng nhu cầu lưu trữ. Để tránh tốn dung lượng không cần thiết, chỉ materialize các truy vấn tốn tài nguyên và phân vùng materialized view cho tập dữ liệu lớn.
  • Chi phí cập nhật và gánh nặng làm mới: Giữ materialized view đồng bộ với bảng nền có thể tốn tài nguyên, đặc biệt với view cần cập nhật thường xuyên hoặc liên quan các tính toán phức tạp. Để giảm gánh nặng làm mới, hãy dùng làm mới tăng dần nếu được hỗ trợ hoặc đặt chu kỳ làm mới phù hợp vào thời điểm hệ thống ít sử dụng.
  • Tính nhất quán và đồng bộ dữ liệu: Materialized view có thể lỗi thời nếu dữ liệu nền thay đổi thường xuyên, dẫn đến dữ liệu cũ. Để tránh, hãy chọn chiến lược làm mới phù hợp và theo dõi thay đổi dữ liệu để điều chỉnh khi cần.
  • Gánh nặng bảo trì: Materialized view cần bảo trì liên tục, như đặt lịch làm mới phù hợp, theo dõi sử dụng lưu trữ và quản lý phụ thuộc vào các bảng nền. Để khắc phục, luôn dùng lịch làm mới tự động, theo dõi hiệu năng hệ thống và thiết lập cảnh báo khi làm mới thất bại.

Kết luận

Materialized view hữu ích trong các cơ sở dữ liệu SQL để tối ưu hiệu năng truy vấn. Chúng lưu trữ vật lý kết quả truy vấn trên đĩa, mang lại tốc độ truy vấn nhanh hơn nhờ giảm tính toán lại. Tính năng này giúp materialized view phù hợp để xử lý các truy vấn phức tạp, tốn tài nguyên có join, tổng hợp và tập dữ liệu lớn. Hiểu cách triển khai materialized view trong các hệ cơ sở dữ liệu khác nhau sẽ giúp bạn nâng cao kỹ năng tối ưu truy vấn và cơ sở dữ liệu.

Nếu bạn muốn nâng cao kỹ năng SQL, tôi khuyến nghị thử lộ trình nghề nghiệp Associate Data Analyst in SQL của DataCamp để trở thành một nhà phân tích dữ liệu thành thạo. Khóa học Reporting in SQL cũng sẽ giúp bạn thành thạo xây dựng báo cáo và dashboard phức tạp để trình bày dữ liệu hiệu quả. Cuối cùng, bạn nên lấy SQL Associate Certification để chứng minh năng lực dùng SQL giải quyết bài toán kinh doanh và nổi bật giữa các chuyên gia khác.

Allan Ouko

Tác giả

Allan Ouko

Biên tập viên kỹ thuật về Khoa học dữ liệu với kinh nghiệm thực tế trong phân tích dữ liệu, trí tuệ doanh nghiệp và khoa học dữ liệu. Tôi viết nội dung thực tiễn, tập trung vào ngành về SQL, Python, Power BI, Databricks và kỹ thuật dữ liệu, dựa trên công việc phân tích trong thế giới thực. Bài viết của tôi kết nối chiều sâu kỹ thuật với tác động kinh doanh, giúp các chuyên gia chuyển đổi dữ liệu thành những quyết định vững chắc.

Câu hỏi thường gặp

Materialized view trong SQL là gì?

Materialized view là một đối tượng cơ sở dữ liệu lưu trữ vật lý kết quả của một truy vấn, tối ưu hiệu năng bằng cách tránh tính toán lại.

Materialized view khác gì so với view thông thường?

Khác với view thông thường truy xuất dữ liệu động mỗi lần truy cập, materialized view lưu dữ liệu như các bảng vật lý, cho phép thực thi truy vấn nhanh hơn.

Sự khác nhau giữa làm mới toàn phần và tăng dần là gì?

Làm mới toàn phần tính toán lại toàn bộ view, trong khi làm mới tăng dần chỉ cập nhật dữ liệu đã thay đổi, giúp tăng hiệu quả.

Những cơ sở dữ liệu nào hỗ trợ materialized view?

PostgreSQL, SQL Server (indexed views), Oracle, Amazon Redshift và Azure Synapse Analytics hỗ trợ materialized view, mỗi hệ có đặc điểm và hạn chế khác nhau, trong khi MySQL không hỗ trợ gốc.

Materialized view có tiêu tốn thêm dung lượng lưu trữ không?

Có, vì lưu trữ dữ liệu vật lý nên materialized view làm tăng nhu cầu lưu trữ.

Chủ đề

Liên quan