Bài viết Viết lại truy vấn để sử dụng khung nhìn thực có hàm thống kê trong PostgreSQL nghiên cứu xây dựng, tích hợp và đánh giá mô-đun viết lại truy vấn để khai thác khung nhìn thực trên cơ sở truy vấn nối trong có hàm thống kê một cách thông minh trong PostgreSQL.
Kỷ yếu Hội nghị Quốc gia lần thứ VIII Nghiên cứu ứng dụng Công nghệ thông tin (FAIR); Hà Nội, ngày 9-10/7/2015 DOI: 10.15625/vap.2015.000217 VIẾT LẠI TRUY VẤN ĐỂ SỬ DỤNG KHUNG NHÌN THỰC CĨ HÀM THỐNG KÊ TRONG POSTGRESQL Nguyễn Trần Quốc Vinh Trường Đại học Sư phạm, Đại học Đà Nẵng ntquocvinh@ued.vn TÓM TẮT - Khung nhìn thực kết thực thi truy vấn lưu lại sở liệu Hệ quản trị sở liệu sử dụng khung nhìn thực với số lượng ghi nhỏ chứa kết có sẵn để trả lời truy vấn cách nhanh chóng, thay đọc liệu từ bảng gốc xử lý phức tạp lượng lớn liệu Cơng nghệ khung nhìn thực triển khai hệ quản trị sở liệu thương mại (Oracle, DB2, SQL Server) Từ phiên 9.3 phiên 9.4, PostgreSQL hỗ trợ lệnh tạo khung nhìn thực cập nhật tồn phần bất đồng khung nhìn thực Tuy nhiên, PostgreSQL chưa hỗ trợ khai thác khung nhìn thực cách tự động Tác giả nghiên cứu xây dựng, tích hợp đánh giá mô-đun viết lại truy vấn để khai thác khung nhìn thực sở truy vấn nối có hàm thống kê cách thơng minh PostgreSQL Kết thử nghiệm cho thấy hiệu viết lại truy vấn để sử dụng khung nhìn thực - tăng tốc độ thực thi truy vấn lên nhiều lần, đặc biệt truy vấn phức tạp sử dụng lượng liệu lớn Từ khóa - Khung nhìn thực; hàm thống kê; PostgreSQL; xử lý truy vấn; viết lại truy vấn; can thiệp mã nguồn I ĐẶT VẤN ĐỀ Quy mô hoạt động quản lý ngày mở rộng nhanh chóng, kéo theo lượng liệu phải xử lý độ phức tạp truy vấn ngày cao Nhiều sở liệu (CSDL) với dung lượng hàng terabytes, yêu cầu xử lý thông tin ngày phức tạp địi hỏi phải nhanh chóng, xác, chí phải đáp ứng tức thời yêu cầu thời gian thực Việc thực thi truy vấn phức tạp lượng liệu lớn từ CSDL thường yêu cầu chi phí lớn tài nguyên để thực hiện, kể thời gian Điều làm ảnh hưởng đến việc định, hiệu hoạt động tổ chức Vấn đề đặt toán, làm để tăng tốc độ thực thi truy vấn Trong phạm vi viết này, tác giả đề cập đến phương pháp ứng dụng công nghệ khung nhìn thực (KNT, materialized view) để tăng tốc độ thực thi truy vấn Khung nhìn (ảo) đại diện cho truy vấn sử dụng giống bảng Khi truy cập vào khung nhìn, truy vấn đứng phía sau thực thi Ý tưởng ứng dụng KNT – kết thực thi truy vấn giữ lại CSDL, xuất từ năm 80 kỷ trước, KNT triển khai thực tế từ năm 2000 ba hệ quản trị (HQT) CSDL thương mại Oracle, MS SQL Server, IBM DB2 Trong Oracle, KNT gọi “materialized views” phân làm ba loại - read only, updateable writeable [1] Trong IBM DB2, KNT gọi bảng thực hoá truy vấn (materialized query tables, MQT) có hai loại - MQT trì hệ thống MQT trì người dùng Microsoft SQL Server có cơng nghệ tương tự gọi khung nhìn mục hố (indexed views) KNT tạo với ý tưởng ban đầu công cụ hỗ trợ cho kho liệu hệ thống hỗ trợ định Tuy nhiên, ứng dụng cho CSDL [2] Ứng dụng KNT công nghệ đặt nhiều vấn đề cần nghiên cứu Trong đó, nhiều cơng trình nghiên cứu cơng bố liên quan đến thuật tốn cập nhật KNT [2-4] Cơng trình [5] thực sinh tự động mã nguồn ngôn ngữ C bẫy kiện (trigger) cho kiện thêm, cập nhật, xoá liệu tất bảng gốc tham gia vào truy vấn tạo KNT Các bẫy kiện triển khai thuật tốn thực cập nhật gia tăng, đồng KNT Cơng trình [6] thực xây dựng mô-đun viết lại truy vấn hỗ trợ KNT việc sử dụng KNT HQT CSDL PostgreSQL Tuy nhiên, nghiên cứu [6] nhiều hạn chế Chẳng hạn, i) mô tả cách thức viết lại truy vấn chung chung cho vài trường hợp truy vấn đơn giản; ii) cách thức so sánh truy vấn xử lý truy vấn để tìm kiếm khả sử dụng KNT thơ sơ Một số cơng trình cơng bố có nói cách thức so sánh truy vấn lấy KNT để trả lời truy vấn cho số dạng biểu thức mức độ truy vấn SQL dạng văn [4; 7-9] Một số cơng trình khác [4; 7; 10] nghiên cứu cách thức sử dụng KNT để trả lời truy vấn, dạng ý tưởng chung cho số dạng đơn giản chủ yếu nghiên cứu thuật toán cập nhật gia tăng PostgreSQL HQT CSDL mã nguồn mở hàng đầu, sử dụng rộng rãi giới khuyến cáo Bộ Thông tin Truyền thông Việt Nam (Thông tư 41/2009/TT-BTTTT) Từ phiên 9.3 phiên 9.4, PostgreSQL hỗ trợ lệnh tạo KNT (CREATE MATERIALIZED VIEW) cập nhật bất đồng theo cách thực thi lại truy vấn thay tồn nội dung có bảng KNT (REFRESH MATERIALIZED VIEW) Khiếm khuyết lớn chưa có tính viết lại truy vấn phép khai thác KNT [11] cách thông minh Ở đây, ta đề cập đến tính phát khả biến đổi truy vấn tương đương để sử dụng toàn phần KNT để trả lời truy vấn Truy vấn lấy kết từ KNT thay lấy liệu từ bảng gốc xử lý Điều giúp tăng tốc độ thực thi truy vấn phức tạp lượng liệu lớn, giúp nâng cao hiệu suất hoạt động hệ thống, nâng cao hiệu thực thi truy vấn phức tạp sở liệu lớn PostgreSQL Nguyễn Trần Quốc Vinh 761 Trong viết này, tác giả nghiên cứu xây dựng tích hợp mơ-đun viết lại truy hỗ trợ KNT vào mã nguồn PostgreSQL nhằm khai thác KNT PostgreSQL cách hiệu Truy vấn quan tâm bao gồm phép nối trong, phép gộp nhóm hàm thống kê (aggregate functions: SUM, COUNT, AVG, MIN, MAX); không bao gồm truy vấn lồng, phép nối truy vấn đệ quy Nghiên cứu xét đến khả kết truy vấn người dùng tính hồn tồn từ KNT khả kết thực thi truy vấn người dùng chứa kết thực thi truy vấn tạo KNT Khi đó, để trả lời truy vấn người dùng, HQT CSDL phải nối bảng KNT với bảng khác Ngồi ra, nghiên cứu cịn khắc phục nhược điểm cơng trình [6] triển khai thực tiễn, đặc biệt cách thức xử lý so sánh truy vấn để tìm kiếm khả sử dụng KNT II VIẾT LẠI TRUY VẤN KNT kết truy vấn giữ lại CSDL dạng bảng Nếu truy vấn người dùng nhập vào viết lại hướng qua truy vấn tạo KNT, lấy kết từ KNT, thay lấy liệu từ bảng gốc xử lý Có vơ số mẫu truy vấn khác Tuy nhiên, viết xem xét số mẫu truy vấn sử dụng KNT để trả lời truy vấn Để đơn giản, ta ký hiệu truy vấn tạo KNT truy vấn người dùng gửi đến HQT CSDL Truy phải tương đương vấn viết lại để sử dụng KNT ký hiệu Tất nhiên, Truy vấn , , , , , bao , gồm hàm , Trong đó: thống kê biểu diễn sau: ∪ , , , - tập cột/biểu thức lựa chọn mệnh đề SELECT , , , tập hợp cột bảng mệnh đề SELECT , , , tập hợp hàm thống kê với biểu thức (E) cột từ bảng gốc SUM(E), COUNT(E), MIN(E) MAX(E) Để phục vụ trình cập nhập gia tăng đồng KNT tăng khả sử dụng KNT sau này, AVG(E) tự động chuyển , , , tập hợp bí danh thành SUM(E) COUNT(E) E không chứa hàm thống kê (alias) biểu thức tương ứng ; bí danh , , , tập hợp bí danh biểu thức tương ứng ; bí danh Mặc định có dạng – trùng với ∪ tên cột Tập hợp cột bảng KNT Tmv - - mệnh đề FROM Mệnh đề FROM kết hợp tập bảng gốc truy vấn - tập hợp điều kiện phép nối bảng , , , sử dụng - mệnh đề WHERE, điều kiện chọn lựa ghi để xử lý Trong trường hợp truy vấn bao gồm phép nối bao gồm tường minh, không rỗng Ngược lại, rỗng , , , - tập cột/biểu thức gộp nhóm mệnh đề GROUP BY Mặc định có biến đổi truy vấn tạo KNT trình tạo KNT để kết bao gồm biểu thức mệnh đề GROUP BY; nghĩa là, tự thân bao gồm không chứa hàm thống kê, , – rỗng Tương ứng, ta Với truy vấn không bao gồm hàm thống kê, truy vấn tạo KNT , , , , , , , , truy vấn của người dùng , , , , , , , truy vấn viết lại , , , , , , , Bảng KNT Tmv bao gồm cột ∪ Nghiên cứu quan tâm đến dạng truy vấn viết lại truy vấn theo mức độ phức tạp từ thấp đến cao có A tính hồn tồn từ , , , ⊆ biểu thức đại số Ở ta xét trường hợp phần tử Nghĩa là, trùng với phần tử , tính thơng qua toán tử cộng, trừ, nhân, chia đại số Trường hợp: ⊆ ( ⊆ , ⊆ ) ⊆ ⊆ ( ⊆ , SUM E , COUNT E , MIN E , MAX E ) Trước tiên, xét trường hợp sum, count, min, max Với E biểu thức đại số cột mà số khơng thuộc kết phép nối tất bảng với điều kiện nối áp dụng điều kiện Tương ứng, Gọi Vì , , nên Vì ⊆ , ghi ( ) thuộc nhóm có , , ( ) thuộc nhóm thứ z – tương ứng ( ⊆ ), biểu thức trùng với thứ y – có giá trị theo cặp Các ghi thuộc nhóm theo tạo thành h nhóm theo biểu thức theo theo , tương ứng Trong Tmv có cột sum chứa kết SUM(E) Xét SUM(E) có mặt – giá trị ( , sum) Mỗi nhóm theo có h giá trị SUM(E) theo Vậy, tổng h giá trị SUM(E) SUM(E) theo Nói cách khác, ( , SUM(sum)) Tmv ( , SUM(E)) ( ) , tương ứng Trong Tmv có cột count chứa kết Xét COUNT(E) có mặt COUNT(E) theo – giá trị ( , count) Mỗi nhóm theo có h giá trị COUNT(E) theo Vậy, tổng h 762 VIẾT LẠI TRUY VẤN ĐỂ SỬ DỤNG KHUNG NHÌN THỰC CĨ HÀM THỐNG KÊ TRONG POSTGRESQL giá trị COUNT(E) theo COUNT(E)) ( ) COUNT(E) theo Nói cách khác, ( , SUM(count)) Tmv ( , , tương ứng Trong Tmv có cột chứa kết Xét MIN(E), MAX(E) có mặt – giá trị ( , min) Mỗi nhóm theo có h giá trị MIN(E) theo Vậy, giá trị nhỏ MIN(E) theo MIN(E) theo Nói cách khác, ( , MIN(min)) Tmv ( , số h giá trị MIN(E) theo ( ) Tương tự, ( , MAX(max)) Tmv ( , MAX(E)) ( ) MIN(E)) Vậy, với ⊆ ( ⊆ , SUM E , COUNT E , MIN E , MAX E ) , SUM sum , SUM count , MIN , MAX max , , , Tmv , , , ⊂ , ⊆ ( ⊂ và/hoặc , Tmv , , , , Nếu là: ( , , , , ⊂ ) trường hợp riêng ) , Tmv , , , , ⊆ ⊆ Truy vấn viết lại là: tương đương với , ⊆ Truy vấn viết lại trường hợp SUM E , COUNT E , MIN E , MAX E Xét trường hợp sum, count, min, max , E biểu thức đại số cột thuộc Tất cột tham gia vào E Với có Tmv Vì ⊆ , ghi ( ) thuộc nhóm thứ y – ( ) thuộc nhóm thứ z tương ứng, biểu thức trùng với biểu thức có giá trị theo cặp Các – tạo thành h nhóm theo ghi thuộc nhóm theo Xét = “SUM(E)” Mỗi ghi thứ y Tmv đại diện cho nhóm thứ y – bao gồm count ghi thuộc ( ) Nếu xét ( ), giá trị tương ứng cột lặp lại count lần Mỗi nhóm theo có h giá trị tích E*count theo Tổng h giá trị tích E*count theo SUM(E) theo ( , ( ) SUM(E*count)) Tmv ( , SUM(E)) Với = “COUNT(E)”, ( Với = “MIN(E)”, ( Với = “MAX(E)”, ( Vậy, Trường hợp , SUM(count)) Tmv ( , MIN(E)) Tmv ( , MAX(E)) Tmv ( , COUNT(E)) , MIN(E)) , MAX(E)) , SUM E ∗ count , SUM count , MIN E , MAX E , , ( ( ) ) ( ) , Tmv , , , ⊆ Cần ý rằng, trình biến đổi để tạo KNT, biểu thức đại số hàm thống kê phân tách thành thành phần lưu trữ riêng lẻ theo biểu thức mệnh đề Kết hợp hai trường hợp tính cách dễ dàng a) b) cho thấy B Kết thực thi chứa kết thực thi ⊂ , ⊆ , ⊆ , ⊆ , , Nghiên cứu giới hạn truy vấn thoả mãn điều kiện ⊂ , cột thuộc bảng tham gia vào phép nối \ có mặt khơng tạo thành khố bảng Ý tưởng chung hướng tới truy vấn, mà phần liên quan gộp nhóm tách thành truy vấn lồng tham gia vào truy vấn toàn cục đưa danh sách khách hàng tổng số tiền tổng số hàng Xem xét ví dụ KNT mv2 bảng với mua: SELECT sales.cust_id, sum(quantity_sold*unit_cost) as tongtien, sum(sales.quantity_sold) as tongban FROM sales, costs WHERE sales.prod_id = costs.prod_id AND sales.time_id = costs.time_id GROUP BY sales.cust_id Bảng KNT mv2(cust_id, tongtien, tongban) đưa danh sách khách hàng tổng số tiền tổng số hàng mua, thơng tin khách Truy vấn hàng họ tên, quốc gia: SELECT countries.country_id, country_name, customers.cust_id, cust_first_name, cust_last_name, SUM(quantity_sold*unit_price) AS tongtien, sum(sales.quantity_sold) as tongban FROM countries, customers, sales, costs WHERE countries.country_id = customers.country_id AND customers.cust_id = sales.cust_id AND sales.prod_id = costs.prod_id AND sales.time_id = costs.time_id GROUP BY countries.country_id, country_name, customers.cust_id, cust_first_name, cust_last_name Truy vấn viết lại dạng sử dụng truy vấn lồng: SELECT countries.country_id, country_name, customers.cust_id, cust_first_name, cust_last_name, tongtien, tongban FROM countries, customers, (SELECT sales.cust_id, SUM(quantity_sold*unit_price) AS tongtien, sum(sales.quantity_sold) as tongban FROM sales, costs WHERE sales.prod_id = costs.prod_id AND sales.time_id = costs.time_id GROUP BY sales.cust_id) AS Tmv WHERE countries.country_id = customers.country_id AND customers.cust_id = Tmv.cust_id Có thể tạo KNT thành : SELECT countries.country_id, country_name, Tmv cho truy vấn lồng, lúc đó, viết lại Nguyễn Trần Quốc Vinh 763 customers.cust_id, cust_first_name, cust_last_name, tongtien, tongban FROM countries, customers, Tmv WHERE countries.country_id = customers.country_id AND customers.cust_id = Tmv.cust_id theo bước theo thứ tự: i) Nối bảng countries, Thông thường, HQT CSDL thực thi truy vấn customers, sales costs với nhau; ii) thực gộp nhóm theo countries.country_id, country_name, customers.cust_id, cust_first_name, cust_last_name; iii) thực biểu thức mệnh đề SELECT cho nhóm Tuy nhiên, với truy vấn thứ tự bước thực thi sau cho kết đúng: i) Nối bảng sales, costs; ii) thực gộp nhóm theo cust_id; iii) tính cust_id SUM(quantity_sold*unit_price), sum(sales.quantity_sold) cho nhóm – thu bảng kết tạm Tmv; iv) nối Tmv với countries customers; v) thực mệnh đề SELECT countries.country_id, country_name, customers.cust_id, cust_first_name, cust_last_name, total Tmv bảng KNT Tmv Xét trường hợp thứ nhất: - ⊂ , ⊆ , , , ⊂ , ; có mặt – tập hợp tất bảng có cột có mặt - Ít khố bảng \ – tập hợp điều kiện nối Tmv khoá bảng Điều đảm bảo ngược lại ghi Tmv tương ứng với ghi bảng \ Khi đó, ∪ , , , , Tmv ∪ , , , | Với ∈ ∩ Trường hợp thứ hai: - ⊂ ; ⊆ ⊂ ; ; ; ⊂ ; ⊂ (cho tất bảng thuộc ); \ : cột thuộc bảng tham gia vào phép nối - – tập hợp điều kiện nối \ có mặt khơng tạo thành khố bảng Điều kiện đảm bảo: thứ nhất, tương ứng với đảm bảo nối Tmv \ ; thứ hai, ghi kết phép nối bảng \ Khi tương ứng ghi kết phép nối ghi (nếu có) với bảng ghi thuộc bảng \ nhiều – một, nhóm theo cột đủ, nhóm bảng sau khơng làm thay đổi nhóm ghi theo cột \ Khi đó, \ ∪ , , , , Tmv ∪ \ , , , | , với Từ hai trường hợp suy cho trường hợp chung, ⊂ , ⊂ , cột thuộc bảng tham gia vào phép nối \ ∪ , , , , Tmv ∪ không tạo thành khố bảng đó: , \ ∪ ⊆ \ ∈ , ∩ ⊆ , ⊆ , có mặt , ∪ , , III.XÂY DỰNG VÀ TÍCH HỢP MƠ ĐUN VIẾT LẠI TRUY VẤN TRONG POSTGRESQL A Nghiên cứu mã nguồn PostgreSQL Để xây dựng mơ-đun, tác giả tìm hiểu q trình xử lý truy vấn bên mã nguồn PostgreSQL (xem khối “PostgreSQL chưa điều chỉnh” hình 1) Các hàm Postgres nhận truy vấn từ máy khách, gọi hàm xử lý trả kết cho máy khách Posgres tương tác với máy khách thông qua hàm libpq Ban đầu, chuỗi truy vấn vào vị trí Postgres (A3) Sau đó, chuỗi phân tích cú pháp (Parse Statement, A4) cơng cụ lex yacc, trả truy vấn (Query Tree) Cây truy vấn truyền đến hàm viết lại truy vấn (Rewrite Query, A6) để viết lại truy vấn theo luật hệ thống (khơng có luật viết lại truy vấn để hỗ trợ KNT PostgreSQL chưa có KNT) Tiếp theo, hệ thống liệt kê kế hoạch thực (Generate Paths, A7) Sau đó, lựa chọn kế hoạch tối ưu (Optimal Path) tạo kế hoạch (Generate Plan, A8) gửi đến hàm thực thi để thực (Execute Plan, A9) [12] B Lưu trữ thông tin KNT Một công cụ tạo KNT xây dựng Nó tiếp nhận truy vấn, thực phân tích truy vấn, tạo bảng KNT đưa thông tin KNT vừa tạo vào bảng thông tin KNT, phục vụ cho việc xác định khả sử dụng KNT để trả lời truy vấn sau Các bảng tạo sơ đồ hệ thống pg_catalog Nghiên cứu đề xuất tổ chức lưu trữ thông tin truy vấn tạo bảng KNT bảng pg_catalog.pg_mv(mvid, query, mvtable, s, w, j), pg_catalog.pg_mv_select(selcalal, mvid, selcaolexp), pg_catalog.pg_mv_from(mvid, table), pg_catalog.pg_mv_groupby(mvid, tabcol) Bảng pg_catalog.pg_mv lưu thông tin tổng quát truy vấn tạo bảng KNT, gồm tên KNT (mvid), chuỗi truy vấn tạo KNT (query), danh sách bảng tham gia truy vấn (mvtable), mệnh đề select (s), mệnh đề where (w), mệnh đề join (j) Bảng pg_catalog.pg_mv_select lưu thông tin mệnh đề select, gồm tên KNT (mvid), bí danh cột (selcolal), biểu thức (selcolexp) Bảng pg_catalog.pg_mv_from lưu thông tin bảng tham gia vào truy vấn, gồm tên KNT (mvid), tên bảng (table) Bảng pg_catalog.pg_mv_groupby lưu thông tin cột thuộc mệnh đề group by, gồm tên KNT (mvid) tên cột nhóm theo (tabcol) 764 VIẾT LẠI TRUY Y VẤN ĐỂ SỬ DỤNG D KHUNG NHÌN N THỰC CĨ Ĩ HÀM THỐNG KÊ TRONG POSTGRESQL Hìn nh Quá trìnhh xử lý truy vấn n PostgreSQ QL mô-đun vviết lại truy vấnn C C Xây dựng mô-đun m Mô-đunn viết lại truy vấn hỗ trợ KN NT viết lại dạng đầy đ đủ, so sánnh đđể lựa chọn KNT K v viết tươ ơng đương vớ ới Mô-đunn viết bằằng ngôn ngữ ữ C Khi PostggreSQL khởi đđộng, đọc tồn th hông tin KNT K từ bbảng đề cậpp Errorr! Reference source not ffound Error!! Reference source s not found f từ lượcc đồ pg_cataloog lưu vào ccache hệ thống t Rõ ràng g, truy xuất dữữ liệu từ cachee nhanh nhiều so s với từ bảng b Cache bổ sunng có thay y đổi điều nh tạo m KNT Việcc tìm thơng tin n bảng b thự ực theo quuy trình ssau Lấy id củ bảng theo têên bảng từ hààm RelnameG Getrelid, hệ thố ống quét bảng b pg_class trả id bảng ứngg với tên bảng Gọi hàm heap_open h để mở bảng theeo id bảng g chế độ NoLock N Tiếp theo, gọi hàm m heap_beginsscan khởi tạo b duyệt để qu uét bảng vvà hàm heap_ggetnext để yệt qua b ghi bảng b Khi duyyệt hết bảản ghi, dừng duyệt bằn ng hàm heap endscan đóng quan hệ với hàm heap_close h Trên hình - trìnnh xử lý truy vvấn Postg greSQL nhữ ững bổ sung vviết lại truy vấấn hỗ trợ KNT T, trước trruy vấn ngườii dùng nhập vvào xem xét viếết lại qua KNT T hay khơng, tthì mơ-đun lấy thông tin KNT (B2) từ bảng Error! E Reference source n not found Errror! Reference source nott found., lưu vvào mảng Mỗi phần tử mảng có kiểu cấu trúúc ứng với thơơng tin mộ ột KNT Điều giúp duyyệt qua KN NT để lựa chọ ọn KNT có th hể Mô-đunn viết lại truy vấn viết lạại truy vấn dạn ng đầy đủ (B1) thông qua đđiều chỉnh giaii đoạn phân tích cú pháp (A4) Truy vấấn đầy đủ truy vấn troong bảng viếết dạng schema.tablee cột dạng table.column Để lựa chọn K KNT (B B3), tác giả tiiến hành so sáánh thànhh phần truuy vấn người dùng nhập vào v (đã viết lạại đầy đủ (B1))) với thànnh phần trruy vấn tạo KNT K lưu kiểu cấấu trúc (B2) Trước T tiên, điều đ kiện kiểm tra Trư ường hợp tính hồn toồn từ (II A) xét trước, khơng k đạt xét x trường hợpp chứa (II.B) So sáánh thành phầnn theo thứ tự , , và v , Nguyễn Trần Quốc Vinh 765 Việc so sánh biểu thức với , đặc biệt với với tiến hành đề xuất cơng trình [4; 7; 9] Biểu thức đại số chuyển tất vế, thực khai triển, xếp thành phần theo chiều giảm dần theo nhãn phần tử; sau so sánh so sánh chuỗi ký tự Biểu thức luận lý biến đổi dạng chuẩn tắc tuyển, xếp theo nhãn phần tử dựa theo thứ tự ưu tiên tính giao hốn phép tốn, sau so sánh với so sánh chuỗi ký tự Có thể cách giải chưa phải tối ưu; phải phát triển phương pháp hiệu để so sánh biểu thức đại số biểu thức luận lý dạng Tuy nhiên, giải pháp giúp nhận biết biểu thức trùng viết dạng khác sử dụng KNT tương đương với Các dạng truy vấn viết lại Khi lựa chọn KNT rồi, phải sinh trình bày mục Error! Reference source not found Thay lấy liệu từ bảng gốc, liệu lấy từ KNT Điều giúp tiết kiệm chi phí nối bảng, chi phí gộp nhóm theo cột tính tốn hàm thống kê Chuỗi truy vấn viết lại (B5) truyền vào hàm thực thi truy vấn postgres (A3) để thực thi truy vấn viết lại (B5) theo cách thực truy vấn thơng thường D Tích hợp vào mã nguồn Trên hình 1, từ trình xử lý truy vấn bên mã nguồn PostgreSQL, tác giả điều chỉnh mã nguồn để xây dựng tích hợp mô-đun viết lại Mô-đun viết lại truy vấn hỗ trợ KNT phải chèn vào vị trí trước PostgreSQL viết lại truy vấn theo luật hệ thống tức sau vị trí (A5), trước vị trí (A6) Nếu có KNT (B3) truy vấn viết lại tới KNT (B4) gọi lại hàm thực thi với tham số đầu vào truy vấn tới KNT (B5) Ngược lại, khơng có KNT truy vấn người dùng nhập vào tiếp tục xử lý viết lại theo luật (A6) mà PostgreSQL đưa Mơ-đun viết lại có tham số chuỗi truy vấn người dùng nhập vào truy vấn (Query Tree) - kết giai đoạn phân tích cú pháp (A4) Kết trả mô-đun chuỗi truy vấn viết lại tới KNT có (B5) NULL khơng Sau chuỗi truy vấn qua KNT (B5) thực thi truy vấn thông thường cách truyền chuỗi truy vấn (B5) đến hàm thực thi truy vấn PostgreSQL (A3) IV.THỬ NGHIỆM VÀ ĐÁNH GIÁ Sau tích hợp mơ-đun viết lại truy vấn hỗ trợ KNT vào mã nguồn PostgreSQL, tác giả tiến hành biên dịch, cài đặt cấu hình máy chủ theo quy trình [11] Tiếp theo, tác giả tạo KNT, tiến hành chạy truy vấn thử nghiệm, đo lường thời gian thực thi để đánh giá tính khả thi mơ-đun tích hợp Mơi trường chạy thử nghiệm hệ điều hành Windows 10 64 bit, Intel core i5 1.7x4 GHz, RAM 4G DDR3, HDD SATA3 500 GB 7200 vòng/phút Trên CSDL bán hàng mẫu gồm bảng countries - 23 ghi, customers – 55.500, sales – 91.8845, costs – 82.112 với mục tạo khố khố ngoại, tác giả tạo số bảng KNT lưu CSDL với truy vấn bảng 1, thực thi 10 lần truy vấn bảng HQT CSDL PostgreSQL chưa tích hợp mơ-đun viết lại trường hợp tích hợp mơ-đun viết lại, tác giả thu thời gian thực thi trung bình làm trịn đến ms bảng Kết đo lường bảng cho thấy, với truy vấn phức tạp sử dụng lượng liệu lớn KNT hỗ trợ thực thi hiệu quả, thời gian chạy truy vấn nhỏ nhiều lần so với trường hợp không hỗ trợ KNT, nâng cao hiệu suất hoạt động hệ thống; đặc biệt hiệu số lượng nhóm ghi trình xử lý lớn, tỉ lệ tổng số sử dụng KNT lượng ghi số lượng nhóm lớn Nhìn chung, mơ-đun viết lại truy vấn hiệu Ngược lại, sử dụng KNT, mơ-đun khơng hiệu tốn chi phí xử lý quét KNT để lựa chọn KNT viết lại truy vấn Tuy nhiên, chi phí nhỏ chấp nhận Tùy thuộc vào môi trường chạy truy vấn, độ lớn sở liệu, độ phức tạp truy vấn mà chênh lệch thời gian thực thi truy vấn PostgreSQL tích hợp mơ-đun viết lại PostgreSQL chưa tích hợp mơ-đun viết lại cao hay thấp Đối với sở liệu với số lượng ghi nhỏ, truy vấn đơn giản mơ-đun viết lại truy vấn hỗ trợ KNT khơng hiệu Trường hợp kết thực thi tính cách sử dụng KNT bảng khác (trường hợp tính hồn tồn dùng KNT bảng bảng 3) cho hiệu thấp trường hợp kết thực thi (trường hợp 1-3 bảng bảng 3) lỉ lệ độ phức tạp thấp xử lý viết lại phức tạp hơn, nhiên, hiệu cao (giảm 519 lần thời gian thực thi) Các truy vấn phức tạp bao gồm hàm thống kê thường sử dụng nhiều bảng khác nhau, cột tham gia vào hàm thống kê truy vấn thường từ bảng chứa liệu phục vụ mơ tả chi tiết, từ bảng chứa liệu mơ tả phân loại Vì thế, việc triển khai trường hợp kết thực thi tính cách sử dụng KNT bảng khác hữu ích Bảng Truy vấn tạo KNT Mục đích KNT mv1 SELECT countries.country_id, country_name, customers.cust_id, cust_first_name, cust_last_name, SUM(quantity_sold*unit_price) AS total FROM countries, customers, sales, costs WHERE countries.country_id = customers.country_id AND customers.cust_id = sales.cust_id AND sales.prod_id = costs.prod_id AND sales.time_id = costs.time_id GROUP BY countries.country_id, country_name, customers.cust_id, cust_first_name, cust_last_name Đưa danh sách khách hàng với thông tin quốc gia tổng số tiền mua hàng 766 VIẾT LẠI TRUY VẤN ĐỂ SỬ DỤNG KHUNG NHÌN THỰC CĨ HÀM THỐNG KÊ TRONG POSTGRESQL mv2 SELECT sales.cust_id, sum(quantity_sold*unit_cost) as tongtien, sum(sales.quantity_sold) as tongban FROM sales, costs WHERE sales.prod_id = costs.prod_id AND sales.time_id = costs.time_id GROUP BY sales.cust_id Đưa danh sách khách hàng tổng số tiền tổng số hàng mua Bảng Các truy vấn chạy thử nghiệm KNT viết lại Dùng KNT # SELECT countries.country_id, country_name, customers.cust_id, cust_first_name, cust_last_name, SUM(quantity_sold*unit_price) AS total FROM countries, customers, sales, costs WHERE countries.country_id = customers.country_id AND customers.cust_id = sales.cust_id AND sales.prod_id = costs.prod_id AND sales.time_id = costs.time_id GROUP BY countries.country_id, country_name, customers.cust_id SELECT countries.country_id, country_name, SUM(quantity_sold*unit_price) AS total FROM countries, customers, sales, costs WHERE countries.country_id = customers.country_id AND customers.cust_id = sales.cust_id AND sales.prod_id = costs.prod_id AND sales.time_id = costs.time_id GROUP BY countries.country_id, country_name SELECT sales.cust_id, sum(quantity_sold*unit_cost) /sum(quantity_sold) as tb FROM sales, costs WHERE sales.prod_id = costs.prod_id AND sales.time_id = costs.time_id GROUP BY sales.cust_id SELECT countries.country_id, country_name, customers.cust_id, cust_first_name, cust_last_name, SUM(quantity_sold*unit_price) AS tongtien, sum(sales.quantity_sold) as tongban FROM countries, customers, sales, costs WHERE countries.country_id = customers.country_id AND customers.cust_id = sales.cust_id AND sales.prod_id = costs.prod_id AND sales.time_id = costs.time_id GROUP BY countries.country_id, country_name, customers.cust_id, cust_first_name, cust_last_name mv1 mv1 mv2 mv2 Mẫu II.A II.A II.A II.B SELECT country_id, country_name, cust_id, cust_first_name, cust_last_name, total FROM mv1 SELECT country_id, country_name, SUM(total) AS total FROM mv1 GROUP BY country_id, country_name SELECT cust_id, tongTien/ tongBan as tb FROM mv2 SELECT countries.country_id, country_name, customers.cust_id, cust_first_name, cust_last_name, tongtien, tongban FROM countries, customers, mv2 WHERE countries.country_id = customers.country_id AND customers.cust_id = mv2.cust_id SELECT cust_city_id, cust_city, count(cust_id) as sokh FROM customers GROUP BY cust_city_id, cust_city SELECT customers.cust_id, count(prod_id) as goods FROM customers inner join sales on customers.cust_id = sales.cust_id GROUP BY customers.cust_id Bảng Đánh giá hiệu tích hợp mơ-đun viết lại truy vấn Thời gian, chưa tích hợp mơ-đun (T1, ms) Đã tích hợp mơ-đun Dùng KNT Hiệu T1/T2 Thời gian (T2, ms) 211594 Có 93 2275 Có Có Có 62 71 348 480 Có 21589 34143 273220 Có 519 526 Có 219 Không 267 0.822 Không 34289 Không 34358 0.997 Khơng Có Nghiên cứu chưa quan tâm đến truy vấn bao gồm truy vấn lồng, phép nối truy vấn đệ quy, dù lĩnh vực quan trọng phổ biến Trên thực tế, với hầu hết trường hợp truy vấn bao gồm truy vấn lồng, người dùng chủ động viết lại dạng truy vấn bao gồm phép nối trong, không bao gồm truy vấn lồng ứng dụng khả viết lại mô-đun Việc sử dụng nhiều KNT để trả lời truy vấn cần nghiên cứu Chẳng hạn, cho tốn tính tổng số lượng mặt hàng nhập, xuất, lại kho Thông thường, Nguyễn Trần Quốc Vinh 767 người ta phải tổ chức hai khung nhìn để tính tổng xuất tổng nhập, sau viết truy vấn bao gồm phép nối trái sử dụng hai khung nhìn Rõ ràng, xây dựng hai KNT thay hai khung nhìn xây dựng chế đủ thông minh hiệu để nhận biết khả sử dụng nhiều KNT để trả lời truy vấn V KẾT LUẬN Nghiên cứu xây dựng quy luật viết lại triển khai thực tế HQT CSDL PostgreSQL truy vấn tương đương với theo dạng phổ biến – truy vấn bao gồm phép nối với điều kiện chọn lựa ghi hai trường hợp: i) kết thực thi tính hoàn toàn dùng KNT; ii) kết thực thi tính cách sử dụng KNT bảng khác Tác giả nghiên cứu quy trình xử lý truy vấn bên mã nguồn PostgreSQL, xây dựng mô-đun viết lại truy vấn theo tiêu chuẩn mã nguồn PostgreSQL, can thiệp tích hợp mơ-đun vào mã nguồn PostgreSQL, thử nghiệm đánh giá tính khả thi mô-đun Kết thử nghiệm mô-đun cho thấy hiệu viết lại truy vấn để sử dụng KNT - tăng tốc độ thực thi truy vấn lên nhiều lần, đặc biệt truy vấn phức tạp sử dụng lượng liệu lớn Với trường hợp truy vấn không sử dụng KNT, thời gian thực thi lớn so với khơng có mơ-đun viết lại chi phí tìm kiếm KNT Tuy nhiên, chênh lệch không đáng kể VI.TÀI LIỆU THAM KHẢO [1] "Materialized Views - Oracle to SQL Server Migration", (Truy cập: 20/02/2013) [2] Nguyễn T Q V., "Ứng dụng khung nhìn thực để nâng cao tốc độ thực thi truy vấn", Tạp chí Khoa học cơng nghệ, Đại học Đà Nẵng, 1(30), 2009, tr 59-65 [3] Zhou J., Larson P.-A., Goldstein J., "Partially materialized views", Technical Report MSR-TR-2005-77, Microsoft Research, 2005 [4] Zaharioudakis M., Cochrane R., Lapis G., Pirahesh H., Urata M., "Answering complex SQL queries using automatic summary tables", In Proc of SIGMOD Conference, 2000, pp 105-116 [5] Nguyễn T Q V., Trần T.N., "Nghiên cứu xây dựng mô-đun sinh tự động mã nguồn trigger ngôn ngữ C thực cập nhật gia tăng, đồng khung nhìn thực PostgreSQL", HTKH Quốc gia Nghiên cứu ứng dụng Công nghệ thông tin (FAIR), VII-2014, tr 440-448 [6] Nguyễn V.Q., Nguyễn T.Q.V., "Nghiên cứu xây dựng tích hợp mơ-đun viết lại truy vấn hỗ trợ khung nhìn thực PostgreSQL", Tạp chí Khoa học Cơng nghệ - Đại học Đà Nẵng, 8(69), 2013, tr 169-175 [7] Srivastava D., Dar S., Jagadish H.V., Levy A.Y., "Answering Queries with Aggregation Using Views", Proceedings of the 22th International Conference on Very Large Data Bases, 1996, Morgan Kaufmann Publishers Inc.: 318-329 [8] Kungurtsev A.B., Nguyen T.Q.V., "The analysis of feasibility of applying the materialized views in information systems", Odes’kyi Politechnichnyi Universytet Pratsi, 2(20), 2003, pp 102-106 [9] Kungurtsev A.B., Nguyen T.Q.V., Blashko A.A., "Сравнение запросов в реляционных базах данных для построения материализованных представлений - Comparison of queries in a relational database to build materialized views", Praci UNDIRT, Ukraine, 3(39), 2004, pp 35-38 [10] Kungurtsev A.B., Nguyen T.Q.V., "Data extraction from materialized views in information systems", Odes’kyi Politechnichnyi Universytet Pratsi, 1(23), 2005, pp 82-87 [11] PostgreSQL, "PostgreSQL 9.4 Documentation", 2015 [12] Group T.P.G.D., "PostgreSQL Backend Flowchart", (Truy cập: 20/5/2014) QUERIES REWRITING FOR USING MATERIALIZED VIEWS WITH AGGREGATE FUNCTIONS IN POSTGRESQL Nguyen Tran Quoc Vinh ABSTRACT - Materialized views are retained executed query results and help answer queries quickly instead of taking data from the original tables The materialized views technology is implemented in commercial database management systems (Oracle, DB2, SQL Server) Since v.9.3 and now, v.9.4, PostgreSQL supports commands for creating materialized views and updating asynchronously with full refresh It does not support automatic using of materialized views In this article, the author explores the process of query processing in PostgreSQL, aims to build, integrate the module that queries with aggregate functions are rewriten to use the materialized views in PostgreSQL by the clever way Keywords - materialized views; aggregate functions; PostgreSQL; query processing; query rewriting; open source intervention ... yacc, trả truy vấn (Query Tree) Cây truy vấn truy? ??n đến hàm viết lại truy vấn (Rewrite Query, A6) để viết lại truy vấn theo luật hệ thống (khơng có luật viết lại truy vấn để hỗ trợ KNT PostgreSQL. .. nhóm theo cột tính tốn hàm thống kê Chuỗi truy vấn viết lại (B5) truy? ??n vào hàm thực thi truy vấn postgres (A3) để thực thi truy vấn viết lại (B5) theo cách thực truy vấn thơng thường D Tích... VẤN ĐỂ SỬ DỤNG D KHUNG NHÌN N THỰC CĨ Ĩ HÀM THỐNG KÊ TRONG POSTGRESQL Hìn nh Quá trìnhh xử lý truy vấn n PostgreSQ QL mô-đun vviết lại truy vấnn C C Xây dựng mô-đun m Mô-đunn viết lại truy vấn hỗ