Thư viện tri thức trực tuyến
Kho tài liệu với 50,000+ tài liệu học thuật
© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Xây dựng mô-đun sinh tự động mã nguồn trigger trên ngôn ngữ c phục vụ cập nhật gia tăng, đồng bộ các khung nhìn thực với truy vấn lồng cho postgresql
Nội dung xem thử
Mô tả chi tiết
ĐẠI HỌC ĐÀ NẴNG
TRƢỜNG ĐẠI HỌC SƢ PHẠM
LÊ THỊ THẢO NGUYÊN
XÂY DỰNG MÔ-ĐUN SINH TỰ ĐỘNG MÃ NGUỒN
TRIGGER TRÊN NGÔN NGỮ C PHỤC VỤ CẬP NHẬT
GIA TĂNG, ĐỒNG BỘ CÁC KHUNG NHÌN THỰC VỚI
TRUY VẤN LỒNG CHO POSTGRESQL
Chuyên ngành: Hệ thống thông tin
Mã số: 8480104
TÓM TẮT LUẬN VĂN THẠC SĨ
HỆ THỐNG THÔNG TIN
Đà Nẵng – Năm 2018
Công trình được hoàn thành tại
TRƯỜNG ĐẠI HỌC SƯ PHẠM
Người hướng dẫn khoa học:
TS. Nguyễn Trần Quốc Vinh
Phản biện 1: PGS. TS. Nguyễn Thanh Bình
Phản biện 2: GS. TS. Nguyễn Thanh Thủy
Luận văn sẽ được bảo vệ trước Hội đồng chấm Luận
văn tốt nghiệp thạc sĩ Hệ thống thông tin họp tại
Trường Đại học Sư phạm vào ngày 18 tháng 11 năm
2018.
Có thể tìm hiểu luận văn tại:
Thư viện Trường Đại học Sư phạm – ĐHĐN
Khoa Tin Học, Trường Đại học Sư phạm – ĐHĐN
1
LỜI MỞ ĐẦU
1. Lý do chọn đề tài
Khung nhìn thực (KNT) là một kỹ thuật giúp cải thiện và nâng
cao tốc độ thực thi đối với các truy vấn phức tạp, có tần suất sử dụng
cao trên một lượng dữ liệu lớn. Đối với những truy vấn phức tạp bao
gồm nhiều phép nối và các hàm thống kê, hiệu quả sử dụng KNT
càng rõ rệt, đặc biệt khi áp dụng trên một lượng dữ liệu đủ lớn. Đến
nay, kỹ thuật KNT đã được triển khai trên các hệ quản trị cơ sở dữ
liệu (HTQCSDL) thương mại lớn như Oracle, Microsoft SQL Server,
IBM DB2,… và ngày càng được ứng dụng rộng rãi.
PostgreSQL là một HQTCSDL mã nguồn mở hàng đầu trên thế
giới, tuy nhiên KNT mới được triển khai trên PostgreSQL ở phiên
bản 9.3.4 và chưa hỗ trợ vấn đề cập nhật đồng bộ gia tăng. Thay vào
đó, PostgreSQL cập nhật KNT theo cơ chế toàn phần bất đồng bộ,
tức là thực thi lại toàn bộ truy vấn dùng để tạo KNT mỗi khi cần cập
nhật. Điều này tốn chi phí xấp xỉ chi phí thực hiện truy vấn, và không
đảm bảo được dữ liệu trên KNT luôn luôn là mới nhất. Đến phiên
bản 10 có bổ sung tính năng cập nhật đồng thời, tuy nhiên tính năng
này chỉ hỗ trợ việc truy cập đồng thời đến KNT, nghĩa là cung cấp
khả năng truy cập bảng KNT để trả lời truy vấn ngay cả khi nó đang
được cập nhật bằng lệnh refresh materialized view, chứ chưa đề cập
đến vấn đề CNGT.
Cập nhật gia tăng (CNGT) là kỹ thuật cập nhật dữ liệu trên
KNT một cách đồng bộ, được thực hiện mỗi khi dữ liệu tại các bảng
gốc (BG) tham gia vào KNT có sự thay đổi, nhờ đó giúp cho KNT
luôn trong trạng thái được cập nhật. Do vậy, việc nghiên cứu các kỹ
thuật CNGT cho KNT trên PostgesSQL đang rất được quan tâm.
Việc CNGT KNT có thể được thực hiện thông qua việc xây
dựng các trigger bắt các sự kiện làm thay đổi dữ liệu trên các bảng
gốc, từ đó tiến hành xác định các thay đổi có thể làm ảnh hưởng đến
tính đúng đắn của kết quả được lưu trong KNT, sau đó tiến hành việc
cập nhật dữ liệu trong KNT. PostgreSQL hỗ trợ 2 loại trigger là
trigger viết bằng ngôn ngữ PL/pgSQL và trigger viết bằng ngôn ngữ
C. Đã có nghiên cứu về việc sử dụng trigger mã nguồn PL/pgSQL để
CNGT đồng bộ cho KNT trong PostgreSQL [2, 3, 5], nhưng trigger
mã nguồn PL/pgSQL được đánh giá là có hiệu năng chưa cao ở hầu
hết các xử lý so với trigger trong ngôn ngữ C, trigger trên ngôn ngữ
2
C thực thi nhanh hơn so với trigger trên ngôn ngữ PL/pgSQL
(khoảng 13%). Vì vậy, nghiên cứu này đề xuất sử dụng ngôn ngữ C
làm mã nguồn cho trigger và xây dựng mô-đun để sinh tự động các
trigger cho tất cả các BG tham gia vào truy vấn, phục vụ thực hiện
CNGT KNT trong cơ chế đồng bộ, như một phần của giao tác thực
hiện thao tác dữ liệu trong các BG.
Đã có các nghiên cứu [1, 2, 3] xây dựng được chương trình sinh
mã nguồn trigger tự động bằng ngôn ngữ C, triển khai các thuật toán
CNGT KNT trên HQTCSDL PostgreSQL. Tuy nhiên nghiên cứu này
vẫn chưa quan tâm đến các KNT được tạo bởi truy vấn lồng, truy vấn
đệ quy, truy vấn bao gồm phép nối ngoài. Có thể thấy truy vấn lồng
(SubQuery) là một dạng truy vấn phổ biến, tần suất xuất hiện cao,
tuy nhiên các nghiên cứu về CNGT KNT cho PostgreSQL đến nay
vẫn chưa hỗ trợ dạng truy vấn này.
Vì vậy, tôi chọn đề tài “Xây dựng mô-đun sinh tự động mã
nguồn trigger trên ngôn ngữ C phục vụ cập nhật gia tăng, đồng bộ
các khung nhìn thực với truy vấn lồng cho PostgreSQL” làm khóa
luận tốt nghiệp cao học.
2. Mục tiêu và nhiệm vụ đề tài
2.1. Mục tiêu
- Xây dựng chương trình sinh tự động mã nguồn trigger trên
ngôn ngữ C phục vụ cập nhật gia tăng, đồng bộ các khung nhìn
thực với truy vấn lồng trong PostgreSQL.
- Chương trình có khả năng sinh mã SQL cài đặt khung nhìn
thực, trigger trên các bảng gốc để cập nhật gia tăng, đồng bộ các
khung nhìn thực.
2.2. Nhiệm vụ
- Tìm hiểu các biên dịch và sử dụng trigger viết bằng ngôn
ngữ C trên PostgreSQL.
- Tìm hiểu và nghiên cứu cơ sở lý thuyết về cập nhật gia tăng,
đồng bộ KNT với truy vấn lồng.
- Khai thác các thuật toán CNGT KNT đã có để ứng dụng vào
đề tài, đặc biệt là thuật toán CNGT KNT với truy vấn lồng.
3. Đối tƣợng và phạm vi nghiên cứu
3.1. Đối tƣợng nghiên cứu
- CSDL quan hệ, HQT CSDL quan hệ, ngôn ngữ lập trình C
- Trigger trên các HQT CSDL quan hệ
3
- Truy vấn lồng, khung nhìn thực
- Thuật toán CNGT KNT với truy vấn lồng
3.2. Phạm vi nghiên cứu
- HQT CSDL PostgreSQL
- Kỹ thuật viết trigger cho PostgreSQL bằng ngôn ngữ C
- Cách sử dụng trigger được viết bằng ngôn ngữ C trên
PostgreSQL
- Các thuật toán CNGT cho KNT trên PostgreSQL
- Thuật toán CNGT KNT hỗ trợ truy vấn lồng
4. Phƣơng pháp nghiên cứu
Về phương pháp nghiên cứu, tôi sử dụng hai phương pháp
chính là nghiên cứu lý thuyết và nghiên cứu thực nghiệm.
4.1. Phƣơng pháp lý thuyết
Thu thập, chọn lọc, phân loại, ghi chú và nghiên cứu các tài
liệu (sách, bài báo, luận văn, trang web) có liên quan đến khung
nhìn thực, HQTCSDL PostgreSQL, cập nhật gia tăng KNT, đồng
bộ KNT, sinh mã trigger trong ngôn ngữ C.
4.2. Phƣơng pháp thực nghiệm
Dựa trên lý thuyết đã nghiên cứu, tiến hành xây dựng
chương trình sinh tự động mã các trigger thực hiện cập nhật gia
tăng khung nhìn thực với truy vấn lồng trong hệ cơ sở dữ liệu
PostgreSQL; thử nghiệm trên máy đơn và đánh giá tốc độ cập
nhật dữ liệu trên các bảng gốc (BG) có trigger cập nhật KNT.
5. Ý nghĩa khoa học và thực tiễn của đề tài
5.1. Ý nghĩa khoa học
- Đề xuất thuật toán cập nhật gia tăng KNT truy vấn lồng.
- Đề xuất thuật toán sinh tự động mã nguồn các trigger trong
ngôn ngữ C phục vụ cập nhật gia tăng các bảng khung nhìn thực
truy vấn lồng trong hệ quản trị cơ sở dữ liệu PostgreSQL.
5.2. Ý nghĩa thực tiễn
Áp dụng chương trình vào cơ sở dữ liệu PostgreSQL nhằm
làm tăng tốc độ thực thi các truy vấn dữ liệu mà vẫn đảm bào ràng
buộc toàn vẹn dữ liệu. Chương trình sinh tự động mã trigger C
thực hiện CNGT KNT có tính ứng dụng cao, giúp tiết kiệm thời
gian và công sức của người quản trị CSDL khi làm việc với
HQTCSDL PostgreSQL cũng như các HQTCSDL mã nguồn mở
4
có hỗ trợ trigger trong ngôn ngữ C. Chương trình sinh tự động mã
nguồn các trigger có thể hỗ trợ các lập trình viên sinh mã trigger.
6. Cấu trúc của luận văn
Chƣơng 1: Nghiên cứu tổng quan, chương này giới thiệu
tổng quan về ngôn ngữ lập trình C, truy vấn lồng và KNT; cập nhật
gia tăng, đồng bộ KNT. Trình bày các vấn đề liên quan đến trigger
trên C trong PostgreSQL.
Chƣơng 2: Khung nhìn thực trong PostgreSQL và thuật toán
cập nhật gia tăng khung nhìn thực với truy vấn lồng, chương này
trình bày các phương pháp cập nhật KNT; phân tích thuật toán cập
nhật gia tăng KNT với truy vấn lồng.
Chƣơng 3: Xây dựng chương trình sinh tự động mã nguồn
các trigger thực hiện cập nhật gia tăng khung nhìn thực với truy vấn
lồng, chương này trình bày cách cài đặt môi trường CSDL và ngôn
ngữ lập trình; xây dựng mô-đun sinh mã tự động trigger.
5
CHƢƠNG 1
NGHIÊN CỨU TỔNG QUAN
1.1. Tổng quan về ngôn ngữ lập trình C
1.1.1. Ngôn ngữ lập trình C
C là ngôn ngữ rất có hiệu quả và được ưa chuộng để viết các
phần mềm hệ thống, mặc dù nó cũng được dùng cho việc viết các
ứng dụng. C là ngôn ngữ lập trình tương đối nhỏ gọn vận hành
gần với phần cứng, được tạo ra với một mục tiêu là làm cho nó
thuận tiện để viết các chương trình lớn.
1.1.2. Đặc điểm của ngôn ngữ C
Ngôn ngữ C có các đặc điểm sau:
C cũng được sử dụng để lập trình bậc thấp.
C cung cấp nhiều hàm có sẵn giúp việc phát triển các ứng
dụng trở nên nhanh chóng hơn.
Ngôn ngữ C có khả năng mở rộng vì nó dễ dàng nhận một
tính năng mới.
1.2. Tổng quan về truy vấn lồng
1.2.1. Đặc điểm của truy vấn lồng
Là dạng truy vấn mà câu lệnh Select lồng trong câu lệnh
select.
Câu lệnh Select bên ngoài gọi là truy vấn ngoài
Câu lệnh Select bên trong gọi là truy vấn trong hay truy vấn con
Có 2 loại:
- Loại 1: Truy vấn con nằm trong mệnh đề WHERE
SELECT <danh sách cột>
FROM <table_1>INNER JOIN<table_2> ON <điều kiện nối>
INNER JOIN <table_3> ON <điều kiện nối>…
WHERE <so sánh tập hợp> (SELECT <danh sách cột>
FROM < danh sách các bảng>
WHERE<điều kiện>)
- Loại 2: Truy vấn con nằm trong mệnh đề FROM
SELECT <danh sách cột>
FROM <bảng1>, <bảng 2>, (<truy vấn con>) AS<tên bảng>
WHERE <điều kiện>
Các câu lệnh Select có thể lồng nhau ở nhiều mức
Câu truy vấn con thường trả về một tập các giá trị
6
Mệnh đề Where của câu truy vấn ngoài
<biểu thức><so sánh tập hợp><truy vấn con>
- So sánh tập hợp thường đi cùng với một số toán tử IN,
NOT IN, ALL, ANY, EXISTS…
1.2.2. Phân loại
Dựa vào đặc điểm của câu truy vấn con người ta phân truy
vấn lồng thành 2 loại chính:
- Truy vấn lồng phân cấp: Khi nội dung của câu truy vấn con
độc lập với câu truy vấn cha.
Cú pháp:
SELECT A
FROM X
WHERE … (SELECT B, C FROM Y) …
Ví dụ: Đưa ra mã, tên của những sinh viên thuộc lớp CNTT 1
SELECT ma_sv, ten_sv
FROM sinhvien
WHERE ma_lop IN ( SELECT ma_lop
FROM lop
WHERE ten_lop = „CNTT – 1‟)
Ở ví dụ trên, câu truy vấn con SELECT ma_lop FROM lop
WHERE ten_lop = „CNTT – 1‟không sử dụng bất kỳ thành phần
nào của câu truy vấn cha. Do đó đây là một câu truy vấn lồng
phân cấp.
- Truy vấn lồng tương quan: Khi nội dung của câu truy vấn
con phụ thuộc vào câu truy vấn cha.
Cú pháp:
SELECT A
FROM X
WHERE … (SELECT B, C FROM Y WHERE B = X.A) …
Ví dụ: Đưa ra mã, tên của những sinh viên thuộc lớp CNTT 1
SELECT ma_sv, ten_sv
FROM sinhvien
WHERE EXISTS (
SELECT*
FROM Lop
WHERE ma_lop = sinhvien.ma_lop AND ten_lop =
„CNTT – 1‟)
7
Ở ví dụ này, câu truy vấn con SELECT*. FROM Lop.
WHERE ma_lop = sinhvien.ma_lop and ten_lop = „CNTT – 1‟.
WHERE ma_lop = sinhvien.ma_lop có sử dụng thành phần
của câu truy vấn cha qua biểu thức so sánh ma_lop =
sinhvien.ma_lop. Do đó, đây là một câu truy vấn lồng tương
quan.
1.3. Tổng quan về khung nhìn thực
1.3.1. Giới thiệu chung
Khung nhìn thực (KNT - Materialized view) là một đối
tượng trong cơ sở dữ liệu (CSDL) dùng để lưu trữ kết quả thực thi
của một truy vấn, giúp cải thiện và nâng cao tốc độ thực thi đối
với các truy vấn phức tạp, có tần suất sử dụng cao trên một lượng
dữ liệu lớn. Ý tưởng của KNT là dựa trên các bảng kết quả sẵn có
để trả lời truy vấn một cách nhanh chóng mà không cần thực thi
lại truy vấn. Hiệu quả sử dụng KNT càng rõ rệt đặc biệt khi áp
dụng trên một lượng dữ liệu đủ lớn, do đã bỏ qua các bước thực
thi phép nối và các hàm thống kê vốn là những thành phần chiếm
nhiều chi phí trong quá trình thực thi truy vấn.
Tuy nhiên, việc sử dụng KNT cũng có những nhược điểm;
đó là: KNT làm tiêu tốn không gian lưu trữ và phải được cập nhật
khi các bảng chi tiết cơ bản được sửa đổi.
1.3.2. Phân loại khung nhìn thực
Phân loại khung nhìn thực theo một số loại [15] như sau:
1.3.2.1. KNT bản sao (snapshot materialized view)
1.3.2.2. KNT hăm hở (eager materialized view)
1.3.2.3. KNT rất lười (very lazy materialized view):
1.3.2.4. KNT lười (lazy materialized view):
1.4. Tổng quan về cập nhật gia tăng, đồng bộ khung nhìn thực
1.4.1. Tổng quan về cập nhật gia tăng
Cập nhật gia tăng chỉ sửa đổi nội dung KNT tương ứng với
các thay đổi trong các bảng gốc. Thông thường, cập nhật gia tăng
đòi hỏi chi phí tài nguyên rất nhỏ so với cập nhật hoàn toàn.
Để duy trì các bảng KNT trong trạng thái thực tiễn, cần phải
cập nhật chúng mỗi khi có sự thay đổi dữ liệu trong các bảng gốc.
Trên thực tế, có các bài toán của hệ thống thông tin đòi hỏi phải
tính đến một cách không chậm trễ chỉ một phần trong số các thay
đổi dữ liệu trong các bảng gốc. Từ đó xuất hiện khả năng trì hoãn
8
cập nhật KNT. Khả năng đó cho phép giảm số lượng các cập nhật
KNT, thông qua đó nâng cao đáng kể năng suất tổng thể của hệ
thống.
1.4.2. Cập nhật đồng bộ khung nhìn thực
Phụ thuộc vào thời hạn cập nhật các thay đổi vào các bảng
KNT, các cơ chế cập nhật được phân ra đồng bộ và không đồng
bộ. Cập nhật đồng bộ được thực thi không chậm trễ ngay khi có
thay đổi dữ liệu trong bảng gốc như một phần của giao tác thực
hiện thay đổi đó.
1.5. Cập nhật khung nhìn thực bằng trigger trên C trong
PostgreSQL
1.5.1. Khái niệm về trigger
Trigger là một thủ tục đặc biệt mà việc thực thi của nó tự
động khi có sự kiện xảy ra, các sự kiện gọi thủ tục đặc biệt này
được định nghĩa trong câu lệnh, thông thường được thực hiện với
các sự kiện liên quan đến Insert, Update, Delete dữ liệu. Trigger
được sử dụng trong việc bảo đảm toàn vẹn dữ liệu theo quy tắc
xác định, được quản lý theo bảng dữ liệu hoặc khung nhìn.
1.5.2. Trigger trên các HQT CSDL
Trigger có thể được thực thi trước hoặc sau khi sự kiện xảy
ra, bao gồm các mức:
Row Level Trigger
Column Level Trigger
For Each Row Type
For Each Statement Type
1.5.3. Trigger trong PostgreSQL
Trigger trên PostgreSQL có thể xử lý một tập các bản ghi,
hoặc chỉ xử lý một bản ghi. Chỉ trigger xử lý một bản ghi mới có
thể nhìn thấy dữ liệu đang được thao tác. Vì vậy đề tài thực hiện
sinh mã nguồn trigger bắt sự kiện thay đổi dữ liệu trên các BG
theo cơ chế xử lý từng bản ghi một trong tập các bản ghi được cập
nhật.
1.5.4. Hàm trong C
Hàm trong ngôn ngữ C có thể được biên dịch thành các thư
viện chia sẻ với các phần mở rộng tương ứng là *.dll (trên hệ điều
hành Windows).
9
1.5.5. Hàm trigger trong C
Khi một hàm được khai báo trả về kiểu trigger và được nạp
vào server, có thể tạo hàm trigger bằng lệnh: CREATE TRIGGER
<tên trigger> {BEFORE|AFTER} {INSERT|DELETE|UPDATE}
ON <tên bảng> FOR EACH ROW EXECUTE PROCEDURE
<tên hàm C>.
1.5.6. Ví dụ tạo trigger trên C trong PostgreSQL
Theo ví dụ tạo trigger trên C trong PostgreSQL (phụ lục 1)
thì hàm trigf báo cáo số lượng hàng trong bảng ttest và bỏ qua
phép toán thực tế nếu lệnh cố gắng chèn một giá trị rỗng vào cột
x. (Vì trigger hoạt động như một ràng buộc không rỗng nhưng
không hủy bỏ giao tác). [13]
1.6. Kết chƣơng 1
Chương 1 đã giới thiệu các đối tượng mà đề tài đang làm
việc trực tiếp là ngôn ngữ C, trigger cũng như những đặc điểm
của trigger trong PostgreSQL và cách thức sử dụng các hàm C để
xây dựng thành hàm trigger và cài đặt vào cơ sở dữ liệu. Việc
hiểu rõ những đặc thù về trigger trong PostgreSQL và khả năng
của ngôn ngữ C trong việc triển khai các hàm trigger trong
PostgreSQL đóng vai trò quan trọng trong việc triển khai thuật
toán CNGT.