1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

92 7 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề 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
Tác giả Lê Thị Thảo Nguyên
Người hướng dẫn TS. Nguyễn Trần Quốc Vinh
Trường học Đại Học Đà Nẵng
Chuyên ngành Hệ thống thông tin
Thể loại Luận văn thạc sĩ
Năm xuất bản 2018
Thành phố Đà Nẵng
Định dạng
Số trang 92
Dung lượng 5,4 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

ĐẠ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

Trang 1

ĐẠ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

LUẬN VĂN THẠC SĨ NGÀNH HỆ THỐNG THÔNG TIN

Đà Nẵng - Năm 2018

Trang 2

ĐẠ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

NGƯỜI HƯỚNG DẪN KHOA HỌC:

TS Nguyễn Trần Quốc Vinh

Đà Nẵng - Năm 2018

Trang 3

LỜI CAM ĐOAN

Tôi xin cam đoan công trình nghiên cứu khoa học này là của riêng tôi Các số liệu, kết quả nêu trong luận văn là trung thực và chưa từng được ai công bố trong bất kỳ công trình nào Mọi sự giúp đỡ cho việc thực hiện luận văn này đã được cảm ơn và các thông tin trích dẫn trong luận văn đã được chỉ rõ nguồn gốc rõ ràng và được phép công bố

Tac gia lu�n van

Le Thj Thao Nguyen

Trang 6

MỤC LỤC

LỜI CAM ĐOAN i

TRANG THÔNG TIN LUẬN VĂN THẠC SĨ ii

DANH MỤC CÁC TỪ VIẾT TẮT vi

DANH MỤC HÌNH VẼ vii

DANH MỤC CÁC BẢNG viii

LỜI MỞ ĐẦU 1

1 Lý do chọn đề tài 1

2 Mục tiêu và nhiệm vụ đề tài 2

3 Đối tượng và phạm vi nghiên cứu 3

4 Phương pháp nghiên cứu 3

5 Ý nghĩa khoa học và thực tiễn của đề tài 4

6 Cấu trúc của luận văn 4

CHƯƠNG 1 NGHIÊN CỨU TỔNG QUAN 5

1.1 Tổng quan về ngôn ngữ lập trình C 5

1.1.1 Ngôn ngữ lập trình C 5

1.1.2 Đặc điểm của ngôn ngữ C 5

1.2 Tổng quan về truy vấn lồng 6

1.2.1 Đặc điểm của truy vấn lồng 6

1.2.2 Phân loại 8

1.3 Tổng quan về khung nhìn thực 9

1.3.1 Giới thiệu chung 9

1.3.2 Phân loại khung nhìn thực 14

1.4 Tổng quan về cập nhật gia tăng, đồng bộ khung nhìn thực 15

1.4.1 Tổng quan về cập nhật gia tăng 15

1.4.2 Cập nhật đồng bộ khung nhìn thực 16

1.5 Cập nhật khung nhìn thực bằng trigger trên C trong PostgreSQL 16

1.5.1 Khái niệm về trigger 16

1.5.2 Trigger trên các HQT CSDL 17

1.5.3 Trigger trong PostgreSQL 17

1.5.4 Hàm trong C 18

1.5.5 Hàm trigger trong C 19

1.5.6 Ví dụ tạo trigger trên C trong PostgreSQL 19

1.6 Kết chương 1 19

Trang 7

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

20

2.1 PostgreSQL và khung nhìn thực trong PostgreSQL 20

2.2 Các phương pháp cập nhật KNT 21

2.2.1 Phương pháp làm mới KNT 21

2.2.2 Phương pháp cập nhật gia tăng đồng bộ 21

2.2.3 Một số vấn đề cần quan tâm khi CNGT KNT với truy vấn lồng 22

2.3 Thuật toán cập nhật gia tăng KNT với truy vấn lồng 23

2.3.1 Thuật toán chuyển từ truy vấn lồng sang truy vấn nối trong 23

2.3.2 Điều kiện triển khai thuật toán 25

2.3.3 Thuật toán cập nhật gia tăng khung nhìn thực với truy vấn nối trong 26

2.4 Kết chương 2 35

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 36

3.1 Cài đặt môi trường CSDL và ngôn ngữ lập trình 36

3.2 Xây dựng mô-đun sinh mã tự động trigger 36

3.2.1 Tạo cơ sở dữ liệu thực nghiệm 36

3.2.2 Chương trình sinh tự động mã trigger 36

3.2.3 Sử dụng kết quả của chương trình sinh mã 40

3.2.4 Đánh giá kết quả thực nghiệm 41

3.3 Kết chương 3 47

KẾT LUẬN VÀ KIẾN NGHỊ 48

1 THẢO LUẬN MỘT SỐ KẾT QUẢ ĐẠT ĐƯỢC 48

2 GIỚI HẠN CỦA LUẬN VĂN NÀY 48

TÀI LIỆU THAM KHẢO 49

PHỤ LỤC 1 51

PHỤ LỤC 2 55

PHỤ LỤC 3 74

Trang 9

Mô tả hoạt động của HQT CSDL khi xuất hiện truy vấn yêu

trigger

43

trigger

44

Trang 11

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 Ý 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 Đố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, 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 Đế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

Trang 12

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ữ 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

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

trên các bảng gốc để cập nhật gia tăng, đồng bộ các khung nhìn thực

Để đạt được mục tiêu chung đó, tác giả nghiên cứu các mục tiêu cụ thể như sau:

- Nghiên cứu tổng quan về KNT, truy vấn lồng

- 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

- Nghiên cứu tổng quan về trigger trên C trong PostgreSQL

- Xây dựng thuật toán cập nhật gia tăng KNT với truy vấn lồng

Trang 13

- Xây dựng mô-đun sinh tự động mã nguồn trigger

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

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

Trang 14

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

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ở

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 Lập trình viên chỉ cần điều chỉnh trigger được sinh ra theo ý muốn thay vì phải lập trình từ đầu

6 Cấu trúc của luận văn

Ngoài phần mở đầu và kết luận, cấu trúc nội dung của luận văn bao gồm 3 chương:

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

Trang 15

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

Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie, là một trong những ngôn ngữ phổ dụng nhất 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 là một ngôn ngữ đơn giản theo nghĩa là nó giúp ta cách tiếp cận có cấu trúc (chia bài toán thành các phần khác nhau), tập hợp các hàm thư viện phong phú, các kiểu dữ liệu,

Không giống như hợp ngữ, các chương trình C có thể thực thi trên nhiều loại máy khác nhau mà không có sự thay đổi nào Nhưng nó không phải là độc lập về nền tảng như Java

C cũng được sử dụng để lập trình bậc thấp Nó được dùng để phát triển các ứng dụng hệ thống như các nhân Hệ điều hành, trình điều khiển thiết bị, Nó cũng hỗ trợ những tính năng của ngôn ngữ bậc cao Đó là tại sao được gọi là ngôn ngữ bậc trung

C là ngôn ngữ lập trình theo nghĩa chúng ta chia chương trình thành các phần bằng cách sử dụng hàm Vì thế, nó dễ hiểu và dễ chỉnh sửa

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

Trang 16

Nó hỗ trợ nhiều tính năng của Cấp phát bộ nhớ động Trong ngôn ngữ C, chúng ta có thể giải phóng một bộ nhớ được cấp phát tại thời điểm bất kỳ bằng cách gọi hàm free()

Quá trình biên dịch và thực thi của ngôn ngữ C rất nhanh trong thời gian rất ngắn

C cung cấp tính năng con trỏ, chúng ta có thể tương tác trực tiếp với bộ nhớ bằng việc sử dụng con trỏ Chúng ta có thể sử dụng con trỏ cho bộ nhớ, cấu trúc, hàm, mảng,

Trong C, chúng ta có thể gọi hàm ngay bên trong bản thân hàm đó Nó cung cấp những mã có khả năng sử dụng lại cho mỗi hàm

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>…

FROM <bảng1>, <bảng 2>, (<truy vấn con>) AS<tên bảng>

WHERE <điều kiện>

Trang 17

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ị

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ử

SELECT ma_sv, ten_sv

FROM sinh_vien

WHERE ma_lop = ‘ML1’ AND ngay_sinh < ANY (

Trang 18

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

Trang 19

Ở 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 (

Ở 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

Một khung nhìn (view) có thể được xem như là một bảng “ảo” trong cơ sở

dữ liệu có nội dung được định nghĩa thông qua một truy vấn (câu lệnh SELECT) Điểm khác biệt giữa khung nhìn và bảng là khung nhìn không được xem là một cấu trúc lưu trữ dữ liệu tồn tại trong cơ sở dữ liệu Thực chất

dữ liệu quan sát được trong khung nhìn được lấy từ các bảng thông qua câu lệnh truy vấn dữ liệu

Bảng 1.2 dưới đây minh hoạ cho ta thấy khung nhìn có tên DSSV được định nghĩa thông qua câu lệnh SELECT truy vấn dữ liệu trên hai bảng SINHVIEN và LOP:

Trang 20

Bảng 1.1 – Mô tả thông tin chi tiết dữ liệu bảng SINHVIEN và bảng LOP

Từ hai bảng này, ta tạo được khung nhìn sau đây

Bảng 1.2 – Khung nhìn thực DSSV với dữ liệu lấy từ bảng SINHVIEN và LOP

Trang 21

Khung nhìn thực DSSV được mô tả như sau:

CREATE VIEW DSSV(masv,hodem,ten,tuoi,tenlop) AS

SELECT masv, hodem, ten,DATEDIFF(YY, ngaysinh, GETDATE()), tenlop

FROM sinhvien, lop

WHERE sinhvien.malop = lop.malop

Khi khung nhìn đã được định nghĩa, ta có thể sử dụng câu lệnh SELECT

để truy vấn dữ liệu từ khung nhìn như đối với các bảng Khi trong câu truy vấn xuất hiện khung nhìn, hệ quản trị CSDL sẽ dựa vào định nghĩa của khung nhìn để chuyển yêu cầu truy vấn dữ liệu liên quan đến khung nhìn và việc truy vấn dữ liệu được thực hiện bởi yêu cầu tương đương trên các bảng

Việc sử dụng khung nhìn trong cơ sở dữ liệu đem lại các lợi ích sau đây: bảo mật dữ liệu, đơn giản hoá các thao tác truy vấn dữ liệu, tập trung và đơn giản hoà dữ liệu, độc lập dữ liệu

Tuy nhiên, việc sử dụng khung nhìn cũng tồn tại một số nhược điểm:

trên khung nhìn thành những truy vấn trên các bảng cơ sở nên nếu một khung nhìn được định nghĩa bởi một truy vấn phức tạp thì sẽ dẫn đến chi phí về mặt thời gian khi thực hiện truy vấn liên quan đến khung nhìn sẽ lớn

và cập nhật dữ liệu cho bảng cơ sở nhưng chỉ hạn chế đối với những khung nhìn đơn giản Đối với những khung nhìn phức tạp thì thường không thực hiện được; hay nói cách khác là dữ liệu trong khung nhìn là chỉ đọc

Một khung nhìn có thể được cụ thể hóa bằng cách lưu trữ các bộ dữ liệu

của các khung nhìn trong cơ sở dữ liệu, được gọi là khung nhìn thực

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 Đố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

Trang 22

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

Giả sử ta có CSDL quản lý việc mua bán hàng hóa, với các bảng Order, OrderItem và Customer được mô tả như hình 1.1

Hình 1.1 Cơ sở dữ liệu quản lý đặt và giao hàng hóa (Nguồn:

docs.microsoft.com)

Truy vấn tính tổng số tiền bán được của mỗi sản phẩm cũng như tổng số lượng khách hàng đặt mua từng sản phẩm thuộc từng danh mục (category) thuộc dạng phức tạp Lúc này cần thực hiện phép nối giữa 3 bảng liên quan đồng thời phải thực thi các hàm thống khê SUM (trường hợp tính tổng tiền)

và COUNT (trường hợp đếm số lượng khách hàng) Thời gian thực thi truy vấn tỉ lệ thuận với độ lớn của dữ liệu từ mỗi bảng Dữ liệu từ các BG càng tăng theo thời gian, tốc độ thực hiện của truy vấn càng chậm

Trang 23

Hình 1.2 Mô tả hoạt động của HQT CSDL khi xuất hiện truy vấn yêu cầu

sử dụng dữ liệu khi không sử dụng KNT

Tuy nhiên, thông qua việc triển khai lưu trữ bằng KNT, người dùng có thể

dễ dàng có được kết quả và sử dụng nó một cách trực tiếp hoặc kết hợp nó với các truy vấn khác Lúc này, hiệu quả truy vấn xem như đạt mức tối đa, vì HQT CSDL chỉ cần đọc từ bảng KNT kết quả của truy vấn thay vì phải thực hiện phép nối và tính toán các biểu thức thống kê, vốn là các thao tác chiếm nhiều chi phí

Hình 1.3 Cơ sở dữ liệu quản lý đặt và giao hàng hóa sử dụng khung nhìn

thực (Nguồn: docs.microsoft.com)

Trang 24

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)

Mô tả KNT bản sao:

- Chiến lược cập nhật: kiểu KNT được cập nhật theo yêu cầu

- Cài đặt: KNT bản sao được cài đặt khá dễ dàng bằng cách gọi hàm

sau: refresh_matview() Khi gọi hàm refresh_matview(), HQT CSDL sẽ

tự động xóa nội dung của KNT trước đó, rồi thực hiện truy vấn khung nhìn và điền kết quả vào lại KNT với nội dung hiện tại của khung nhìn

đó

1.3.2.2 KNT hăm hở (eager materialized view)

Mô tả KNT hăm hở:

- Chiến lược cập nhật: Chúng được cập nhật ngay sau khi có bất kỳ

thay đổi nào được thực hiện với cơ sở dữ liệu đó mà sẽ ảnh hưởng đến

nó Điều này được thực hiện với một hệ thống kích hoạt trên tất cả các

bảng cơ sở Phụ thuộc vào hàm thay đổi được (như now()) sẽ gây ra

cho KNT trở nên sai lệch, nhưng có thể được sửa chữa với những làm mới nhỏ, mà chỉ ảnh hưởng đến các hàng

- Cài đặt: Việc thực thi KNT hăm hở được thực hiện qua hai hàm

sau:

o mv_refresh_row(PK): cập nhật bộ giá trị với khóa chính PK

o mv_refresh(): sử dụng nếu khung nhìn dựa vào hàm thay đổi được như “now()”

Khi đó, các trigger với các bẫy sự kiện trong các HQT CSDL tương ứng với các truy vấn INSERT, UPDATE và DELETE sẽ được gọi thông qua hàm mv_refresh_row() một cách thích hợp

1.3.2.3 KNT rất lười (very lazy materialized view):

Mô tả khung nhìn thực rất lười như sau:

- Chiến lược cập nhật: Chúng sẽ ghi lại các hàng trong KNT cần

phải được cập nhật, nhưng sẽ không cập nhật cho đến khi hướng đến

Trang 25

Điều này sẽ rất hữu ích nếu bạn đang cam kết nhiều giao dịch mà ảnh hưởng đến KNT đó, nhưng không muốn thực sự cập nhật KNT cho đến sau này Chúng có chức năng tương đương với các KNT bản sao

- Cài đặt: Việc cài đặt KNT kiểu rất lười qua các bước sau:

dụng một số trigger và hàm)

o Cài đặt một hàm "matview_refresh()" mà đọc bản ghi đó và cập nhật KNT theo danh sách các thay đổi trong bản ghi

1.3.2.4 KNT lười (lazy materialized view):

Mô tả khung nhìn thực lười như sau:

- Chiến lược cập nhật: Chúng sẽ ghi lại các hàng trong KNT cần

phải được cập nhật, và cập nhật chúng khi giao dịch được thực hiện Điều này hữu ích nếu nhiều sự thay đổi sẽ ảnh hưởng đến các hàng giống nhau và cũng sẽ cho phép những thay đổi được thực hiện nhanh hơn nhiều

- Cài đặt: Tương tự như KNT rất lười, việc gọi và thực thi khung

nhìn thực thông qua hàm “matview_refresh()”, trong đó cơ chế gọi sẽ

được gọi theo cam kết và không theo yêu cầu

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ác quá trình cập nhật một KNT để đáp ứng với những thay đổi trong dữ liệu cơ bản được gọi là cập nhật khung nhìn

Có ba phương pháp cập nhật KNT, đó là hoàn toàn (COMPLETE), gia tăng (FAST hay còn gọi là INCREMENTAL) và ép buộc (FORCE):

đổ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

tăng, còn nếu không thì sử dụng 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 Phụ thuộc vào thời hạn đưa các thay đổi vào các bảng KNT, các cơ chế cập nhật được phân ra

Trang 26

đồng bộ và không đồng bộ 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 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 đó Ngược lại, cập nhật không đồng bộ được thực hiện vào một thời điểm nào đó sau khi các giao tác sửa đổi dữ liệu trong bảng gốc đã được cố định Cập nhật không đồng bộ khai thác thời gian trì hoãn cho phép trong cập nhật dữ liệu được xác định bởi công nghệ xử lý

dữ liệu trong các hệ thống thông tin và ý nghĩa của các bài toán giải quyết trong đó

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 Điểm khác biệt giữa thủ tục lưu trữ và trigger là: các thủ tục lưu trữ được thực thi khi người sử dụng có lời gọi đến chúng còn các trigger lại được “gọi”

tự động khi xảy ra những giao tác làm thay đổi dữ liệu trong các bảng hoặc khung nhìn

Mỗi một trigger được tạo ra và gắn liền với một bảng hoặc một khung nhìn nào đó trong cơ sở dữ liệu Khi dữ liệu trong bảng hoặc khung nhìn bị thay đổi (tức là khi bảng hoặc khung nhìn chịu tác động của các câu lệnh INSERT, UPDATE hay DELETE) thì trigger sẽ được tự động kích hoạt

Sử dụng trigger một cách hợp lý trong cơ sở dữ liệu sẽ có tác động rất lớn trong việc tăng hiệu năng của cơ sở dữ liệu Các trigger thực sự hữu dụng với những khả năng sau:

Trang 27

- Một trigger có thể nhận biết, ngăn chặn và huỷ bỏ được những thao tác làm thay đổi trái phép dữ liệu trong cơ sở dữ liệu

- Các thao tác trên dữ liệu (xoá, cập nhật và bổ sung) có thể được trigger phát hiện ra và tự động thực hiện một loạt các thao tác khác trên cơ sở

dữ liệu nhằm đảm bảo tính hợp lệ của dữ liệu

phức tạp hơn giữa các bảng trong cơ sở dữ liệu mà bản thân các ràng buộc không thể thực hiện được

đó, chúng sẽ được thực thi theo thứ tự alphabet theo tên của trigger

gọi trigger là trước (before) hay sau (after) từ bên trong trigger, nên ta có thể sinh mã một trigger cho tất cả các sự kiện trên mỗi bảng

1.5.3 Trigger trong PostgreSQL

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 đã chứng minh được trigger viết bằng ngôn ngữ C cho hiệu suất cao hơn trigger viết bằng ngôn ngữ PL/pgSQL (khoảng 13%), mặc dù việc triển khai C trigger trên PostgreSQL được cho là rất phức tạp và không được khuyến nghị Tuy nhiên, đề tài vẫn sử

Trang 28

dụng trigger viết bằng ngôn ngữ C với hy vọng tối ưu hóa hiệu suất cập nhật, một bước quan trọng trong quá trình CNGT

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 Việc xử lý từng bản ghi là không năng suất so với xử lý một tập các bản ghi, nên trong tương lai nếu PostgreSQL hỗ trợ khả năng đọc được tập dữ liệu đang xử lý trong thân hàm trigger, hiệu suất cập nhật sẽ được gia tăng đáng kể

Một bảng có thể được khai báo nhiều trigger, vì vậy các trigger thực hiện CNGT có thể được cài đặt song song với các trigger khác của người dùng

CREATE FUNCTION <tên hàm> returns <tên kiểu trả về> as <tên tệp thư viện chia sẻ trong the mục lib>, <tên hàm trong tệp thư viện chia sẻ đã được biên dịch> LANGUAGE C STRICT;

Trong đó tên hàm là do người dùng tùy chọn, kiểu trả về của hàm trong phạm vi đề tài này là “trigger”, tên hàm trong tệp thư viện chia sẻ đã được biên dịch bắt buộc phải trùng khớp nhau Giả sử có tệp mã nguồn chứa hàm tg_mv1_insert_on_lop được biên dịch thành file mv1.dll, câu lệnh nạp hàm trên vào PostgreSQL tương ứng: create function tg_mv1_insert_on_lop() returns trigger as 'mv1', 'tg_mv1_insert_on_lop' language c strict;

Trang 29

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> Trong đó:

Tên trigger do người dùng tùy chọn, tên hàm C trùng với tên hàm nằm ngay sau lệnh CREATE FUNCTION <tên hàm> ở mục 3.1, không nhất thiết phải trùng hoàn toàn với tên hàm trong tệp thư viện chia sẻ

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

Trên đây là cơ sở lý thuyết bao gồm những kiến thức cơ bản, nền tảng cần nắm vững để triển khai thực hiện đề tài, qua đó đưa ra định hướng cho quá trình phát triển đề tài 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

Trang 30

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

2.1 PostgreSQL và khung nhìn thực trong PostgreSQL

PostgreSQL là một hệ quản trị cơ sở dữ liệu (HQT CSDL) mã nguồn mở, được phát triển dựa trên mã nguồn của trường Đại học Berkeley, hỗ trợ đầy

đủ các thành phần phổ biến của một HQT CSDL như các truy vấn phức hợp, bẫy sự kiện, khung nhìn, tính toàn vẹn của giao dịch, và có thể chạy trên mọi hệ điều hành Được phát triển hơn 20 năm qua bởi đội ngũ kĩ sư giàu kinh nghiệm, PostgreSQL đã tạo được lòng tin về độ tin cậy cũng như tính đúng đắn, toàn vẹn dữ liệu, được bộ thông tin và truyền thông khuyến cáo sử dụng

PostgreSQL không chỉ là cơ sở dữ liệu quan hệ, nó là quan hệ hướng đối tượng Điều này cung cấp cho nó một vài lợi thế so với các cơ sở dữ liệu SQL

mã nguồn mở khác như MySQL, MariaDB và Firebird

Một đặc điểm cơ bản của cơ sở dữ liệu quan hệ hướng đối tượng là hỗ trợ các đối tượng người dùng tự định nghĩa và các hành vi của chúng bao gồm các kiểu dữ liệu, các hàm, các thao tác, các tên miền và các chỉ mục Điều này làm cho PostgreSQL cực kỳ mạnh và linh hoạt Trong những cái khác, các cấu trúc dữ liệu phức tạp có thể được tạo ra, lưu trữ, và truy xuất

PosgreSQL cũng là HQT CSDL đóng vai trò tiên phong trong việc đưa ra những khái niệm quan trọng mà các HQT CSDL thương mại khác rất lâu sau mới có Là một HQT CSDL mã nguồn mở hàng đầu trên thế giới và KNT đã được triển khai trên PostgreSQL ở các phiên bản 9.3.4, 9.4, 10… KNT là tính năng bảng ảo tiện lợi khác đã được hỗ trợ bởi PostgreSQL KNT giống như các view thông thường trong việc trình diễn tập kết quả của một truy vấn

mà bạn muốn sử dụng thường xuyên, ngoại trừ tập kết quả thực sự được lưu trữ trên ổ đĩa giống như các bảng thông thường KNT cũng có thể được đánh chỉ mục, không giống các views thông thường được tạo ra mỗi lần chúng được gọi, KNT là các ảnh chụp tại một thời điểm Chúng không được làm mới (refreshed) ngoại trừ được chỉ định Điều này có thể tăng đáng kể tốc độ với các truy vấn chạy sử dụng KNT Thay vì sử dụng các views thông thường hoặc phải làm các join phức tạp trên các bảng hoặc thực hiện các hàm tập hợp

Trang 31

(aggregation funcitons) trong truy vấn, sử dụng materialized views với các dữ liệu cần thiết sẵn sàng và chờ đợi trên ổ đĩa để tăng hiệu quả Khi bạn sẵn sàng cập nhật dữ liệu trong materialized view, nó có thể làm mới sử dụng lệnh REFRESH [15], tuy nhiên KNT trong PostgreSQL vẫn chưa hỗ trợ vấn

đề cập nhật đồng bộ gia tăng 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

2.2 Các phương pháp cập nhật KNT

2.2.1 Phương pháp làm mới KNT

Việc triển khai KNT cho HQT CSDL PostgreSQL chỉ mới được đưa vào

ở phiên bản 10 và việc cập nhật được thực hiện thông qua lệnh refresh

materialized view Thao tác này về bản chất là tạo lại KNT từ câu truy vấn

gốc (TVG) Đ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 Bất cứ khi nào người dùng truy cập dữ liệu của KNT chỉ có thể thấy được dữ liệu ở lần cập nhật gần nhất, không phải ở thời điểm hiện tại Người dùng vẫn phải cập nhật bằng

lệnh refresh materialized view, tùy thuộc vào người quản trị hệ thống và nhu

cầu sử dụng dữ liệu Phương pháp này không hiệu quả, đặc biệt khi dữ liệu trong KNT yêu cầu tính chính xác tại mọi thời điểm

2.2.2 Phương pháp cập nhật gia tăng đồng bộ

Cập nhật gia tăng 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 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 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 BG, từ đó 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 Có thể xem thao tác CNGT là một phần trong giao tác thay đổi dữ liệu trên các BG

Nghiên cứu đề xuất tạo KNT như một bảng (table), sau đó sử dụng hệ thống các trigger cài đặt trên các BG bắt sự kiện thay đổi dữ liệu, từ đó cập nhật vào KNT những thay đổi liên quan

Trang 32

Hình 2.1 Mô tả quá trình CNGT KNT bằng trigger

2.2.3 Một số vấn đề cần quan tâm khi CNGT KNT với truy vấn lồng

Để quá trình CNGT được tối ưu, ta phải quan tâm đến vấn đề sàng lọc dữ liệu Dễ thấy không phải bất kỳ thay đổi nào từ các BG cũng đều tác động đến KNT Chỉ những dữ liệu nào liên quan trực tiếp đến KNT và ảnh hưởng đến tính đúng đắn của dữ liệu trong KNT mới cần được cập nhật Điều này có thể được thực hiện thông qua việc phân tích các mệnh đề JOIN, WHERE, FROM

để đưa ra điều kiện sàng lọc dữ liệu Mỗi khi thao tác dữ liệu xảy ra trên BG, thông qua điều kiện lọc, ta có thể xác định được dữ liệu đang được xử lý có ảnh hưởng đến KNT hay không, từ đấy đưa ra quyết định tiếp tục thực thi phần mã CNGT hay thoát khỏi hàm trigger Do vậy trong quá trình phân tích TVG để xác định loại truy vấn ta cần xác định mệnh đề WHERE của truy vấn trong có tham chiếu đến thuộc tính của các quan hệ trong mệnh đề FROM ở truy vấn ngoài hay không

Thứ hai, ta phải quan tâm đến các phép nối trong truy vấn Khi một KNT được tạo ra trên cơ sở truy vấn bao gồm nhiều phép nối giữa các bảng với nhau, quá trình CNGT cần chắc chắn dữ liệu trên KNT luôn đảm bảo tính

Trang 33

toàn vẹn, ràng buộc giữa các bảng khi một trong số các BG có sự thay đổi Đặc biệt với truy vấn bao gồm truy vấn nối trong, truy vấn lồng việc phân tích vai trò của các bảng trong từng nhóm bảng nối và trong toàn bộ truy vấn là hết sức cần thiết Với truy vấn lồng, tùy vào vai trò của bảng trong phép nối

và trong toàn bộ truy vấn, trường hợp thao tác dữ liệu xảy ra có thể xuất hiện

cả tập bản ghi được thêm mới vào KNT lẫn tập bản ghi phải xóa từ KNT, khác với truy vấn nối trong chỉ cần thêm mới (trường hợp insert) hoặc xóa đi (trường hợp delete)

2.3 Thuật toán cập nhật gia tăng KNT với truy vấn lồng

2.3.1 Thuật toán chuyển từ truy vấn lồng sang truy vấn nối trong

WHERE<điều kiện nối>)

Bước 1: Gọi tập các trường chứa trong mệnh đề lần lượt là:

Trang 34

Bước 2: Chuyển câu truy vấn có Join về dạng Where

Bước 3: Chuyển câu truy vấn lồng về truy vấn nối trong

SELECT SELc

FROM FROc  FROl

WHERE WHEc AND WHEl AND A AND B

Cho CSDL quản lý sinh viên đơn giản với 3 bảng và các quan hệ 1 – n:

Hình 2.2 CSDL quản lý sinh viên đơn giản với 3 bảng

Ví dụ 1: Đưa ra danh sách các sinh viên đang học tập tại khoa Tin:

Trang 35

WHERE ma_khoa = ‘TI’)

SELECT ma_sv, ten_sv

FROM sinh_vien JOIN lop ON sinh_vien.ma_lop= lop.ma_lop WHERE ma_khoa = ‘TI’

Phân tích câu lệnh truy vấn lồng

Danh sách SELECT chính (SELc): ma_sv, ten_sv

Danh sách FROM chính (FROc): sinh_vien

Danh sách IN chính (INc): ma_lop

Danh sách WHERE chính (WHEc): không có

Danh sách SELECT lồng (SELl): ma_lop

Danh sách FROM lồng (FROl): lop

Danh sách IN lồng (INl): không có

Danh sách WHERE lồng (WHEl): ma_khoa = “TI’

Từ phân tích truy vấn lồng ta có thể chuyển đổi sang truy vấn nối trong như sau:

SELECT SELc

FROM FROc JOIN FROl ON FROc INc = FROl.SELl

WHERE WHEc AND WHEl

Dựa vào thuật toán và phân tích chuyển đổi ở ví dụ trên ta có thể áp dụng thuật toán cập nhật gia tăng khung nhìn thực với truy vấn nối trong được trình bày ở mục 2.3.3 để cập nhật gia tăng khung nhìn thực với truy vấn lồng

2.3.2 Điều kiện triển khai thuật toán

Trong phạm vi đề tài hiện tại chỉ phục vụ cho các KNT được tạo trên cơ

sở TVG thỏa mãn những điều kiện sau đây:

- Điều kiện nối trên các bảng chỉ liên quan trực tiếp đến các bảng

- Tất cả khóa của các bảng phải tham gia vào mệnh đề SELECT

- Đối với truy vấn lồng có nhiều so sánh tập hợp tuy nhiên trong luận

văn này chỉ đề cập đến phép IN

- Các truy vấn lồng được chuyển đổi thành truy vấn nối trong

Trang 36

2.3.3 Thuật toán cập nhật gia tăng khung nhìn thực với truy vấn nối trong

2.3.3.1 Truy vấn SPJ (Select – Project – Join)

Truy vấn SPJ là truy vấn chỉ bao gồm các mệnh đề SELECT, FROM, WHERE, nhưng không bao gồm các chức năng nhóm và tổng hợp Từ mệnh đề có thể chứa các kết nối bên trong Đối với trường hợp SPJ KNT, đã xây dựng một chương trình tạo mã kích hoạt thực hiện cập nhật gia tăng dựa trên thuật toán đã cải tiến các bản phát hành trước

đó [13] và tạo phần mềm của nó cho tổng hợp tự động của mã nguồn kích hoạt để cập nhật gia tăng KNT xem xét rằng:

- Kết quả truy vấn có thể chứa trùng lặp;

- Bất kỳ một khóa của mỗi BG được thêm tự động vào mệnh đề SELECT;

- Xem xét hoạt động sửa đổi dưới dạng các hoạt động tương đương như xóa và chèn tiếp;

- Loại trừ thao tác dữ liệu trong BG không ảnh hưởng đến KNT; KNT kiểu SPJ là KNT được tạo ra trên cơ sở truy vấn SPJ – truy vấn chỉ chứa các phép chọn, chiếu và nối; kết quả thực thi các truy vấn

có thể chứa các bản ghi trùng lặp, nhưng không bao gồm các phép toán thống kê (SUM, COUNT, AVG, MIN, MAX…) Truy vấn tạo KNT kiểu SPJ với truy vấn gốc:

J: Tập hợp các điều kiện của các phép nối

W: Mệnh đề WHERE, điều kiện chọn lựa bản ghi để xử lý

T i={𝑇𝑖|i=1, 2, ,n} – tập hợp các bảng gốc được sử dụng trong truy

vấn

Trang 37

Fins: Mệnh đề FROM trong trường hợp thêm bản ghi

Cứ mỗi khi dữ liệu trong các BG được cập nhật, các KNT sử dụng các dữ liệu đó trở nên không thực tiễn Để duy trì các bảng KNT trong trạng thái thực tiễn (actual state), cần phải cập nhật chúng mỗi khi có sự thay đổi dữ liệu (insert, update, delete) trong các BG Quá trình làm cho

dữ liệu trong KNT tương ứng với dữ liệu trong các BG được gọi là sự thực tiễn hoá (actualization, cập nhật)

Tuỳ thuộc vào cách thức thực hiện, cập nhật được chia thành ba phương pháp chính, đó là cập nhật hoàn toàn (COMPLETE), cập nhật gia tăng (INCREMENTAL hay còn gọi là FAST) và ép buộc (FORCE) Cập nhật hoàn toàn thực tế là thực thi lại truy vấn trên cơ sở KNT đã được tạo ra và lưu kết quả vào KNT CNGT chỉ thực hiện điều chỉnh phần dữ liệu trong KNT liên quan đến các sửa đổi dữ liệu trong các BG Cập nhật ép buộc nghĩa là khi có khả năng thì thực hiện CNGT, còn nếu không thì sử dụng cập nhật hoàn toàn Trong hầu hết các trường hợp có thể thực hiện CNGT đối với các KNT kiểu SPJ

Chúng ta xét riêng rẽ ba trường hợp thêm mới, sửa đổi và xoá các bản ghi Việc sửa đổi một bản ghi có thể xem là tương đương với nhóm hai hành động liên tiếp: xoá một bản ghi và sau đó thêm mới một bản ghi

a Trường hợp thêm mới các bản ghi

Giả sử tập hợp các bản ghi 𝑇𝑖𝑖𝑛𝑠được thêm vào BG 𝑇𝑖 Bước 1: Fins = T1 J T2 J …… d𝑇𝑖𝑖𝑛𝑠 J … Tn

Bước 2: 𝑑𝑄𝑖𝑖𝑛𝑠 = Select S from Fins where W

b Trường hợp xoá các bản ghi

Giả sử tập hợp các bản ghi 𝑇𝑖𝑑𝑒𝑙được xoá từ BG 𝑇𝑖 Bước 1: Fdel = T1 J T2 J …… d𝑇𝑖𝑑𝑒𝑙 J … Tn

Bước 2: 𝑑𝑄𝑖𝑑𝑒𝑙 = Select S from Fdel where W Bước 3: For each X in 𝑑𝑄𝑖𝑑𝑒𝑙:

Delete from MV

Trang 38

Where MV 𝐾𝑇1 (X) = 𝐾𝑇1 (X) And

MV 𝐾𝑇𝑖 (X) = 𝐾𝑇𝑖 (X) And

MV 𝐾𝑇𝑛 (X) = 𝐾𝑇𝑛 (X)

c Trường hợp sửa đổi các bản ghi

Giả sử trong BG 𝑇𝑖 , tập hợp các bản ghi 𝑇𝑖𝑜𝑙𝑑 được thay đổi thành tập hợp 𝑇𝑖𝑛𝑒𝑤

Dễ nhận thấy rằng, sửa đổi một bản ghi tương đương với xoá bỏ một bản ghi sau đó thêm mới một bản ghi khác Đối với trường hợp tập hợp, cập nhật một tập hợp các bản ghi tương đương với xoá bỏ một tập hợp bản ghi, sau đó thêm mới một tập hợp bản ghi khác Suy ra, trong trường hợp này có thể thực thi mục b và tiếp theo sau đó là mục a để CNGT KNT (update Ti = delete Tiold + insert Tinew), với 𝑇𝑖𝑑𝑒𝑙=𝑇𝑖𝑜𝑙𝑑 và

𝑇𝑖𝑖𝑛𝑠=𝑇𝑖𝑛𝑒𝑤tương ứng Trong đó, mỗi bản ghi <𝑇𝑗𝑜𝑙𝑑𝑘 > tương ứng với một bản ghi <𝑇𝑗𝑛𝑒𝑤𝑘 >

2.3.3.2 Truy vấn nối trong bao gồm các hàm thống kê

Thuật toán CNGT đồng bộ KNT trên cơ sở các truy vấn bao gồm phép nối trong được tham khảo từ công trình nghiên cứu [2], chủ yếu được tổng hợp và phát triển từ các nghiên cứu [6-11] Thuật toán này chưa quan tâm đến KNT được tạo trên cơ sở truy vấn lồng, truy vấn đệ quy, truy vấn bao gồm phép nối ngoài Giả sử KNT được tạo trên cơ sở truy vấn bao gồm các hàm thống kê Q (S, F, J, W, G) Trong đó:

S: Mệnh đề SELECT, tập các cột được lựa chọn S có thể bao gồm các cột hoặc các hàm thống kê với biểu thức (E) trên các cột từ BG như SUM(E), COUNT(E), AVG(E), MIN(E) và MAX(E) E không chứa các hàm thống kê

F: Mệnh đề FROM, tập các BG T1, T2…Tn được sử dụng trong truy vấn tạo KNT

J: Tập hợp các điều kiện của các phép nối

W: Mệnh đề WHERE, điều kiện chọn lựa bản ghi để xử lý

G: Mệnh đề GROUP BY, tập các cột gộp nhóm

A = S\G - tập hợp các hàm thống kê trong mệnh đề SELECT

Trang 39

a Tạo khung nhìn thực

Thông tin về cách thức biến đổi truy vấn để tạo KNT, cụ thể, thông tin

về các cột trong bảng KNT giúp làm rõ các thuật toán cập nhật Mục đích của việc biến đổi là để có thể sử dụng KNT tối ưu hơn và tối ưu hơn cả trong việc thực hiện CNGT KNT S bao gồm các cột sẽ được lưu trong bảng KNT Về các hàm thống kê, ta chỉ xem xét các trường hợp SUM(E), COUNT(E), AVG(E), MIN(E) và MAX(E) Từ quy định

về cú pháp của lệnh truy vấn SELECT của ngôn ngữ SQL cũng như suy luận từ đại số quan hệ, có thể khẳng định, “cột” trong S có thể được hiểu là:

i) Một cột từ BG, hoặc là

ii) Biểu thức đại số trên các hàm thống kê, hoặc là

iii) Biểu thức đại số trên cột từ BG và hàm thống kê Biểu thức (E) được đề cập không bao gồm hàm thống kê, nghĩa là không có trường hợp hàm thống kê là tham số của hàm thống kê Với trường hợp iii), cột tham gia vào biểu thức một cách ngang hàng với hàm thống kê (chẳng hạn cột colA trong truy vấn: SELECT…, (colA + SUM(colB)) AS sumAB… GROUP BY …, colA), ta có thể xem xét như các cột bình thường khác tham gia vào G

Vậy nên, thay vì lưu kết quả biểu thức đại số giữa các hàm thống kê hoặc hàm thống kê và cột, ta lưu kết quả thực thi của từng hàm thống

kê Vì vậy, nghiên cứu [2] đề xuất thực hiện một số biến đổi truy vấn trong quá trình tạo KNT:

có thể xoá một bản ghi từ bảng KNT Nếu không còn bản ghi nào tham gia vào nhóm, thì bản ghi cho nhóm cũng cần phải được xoá từ bảng KNT Thật vậy, không có trường hợp nào trong số MAX, MIN, SUM giúp xác định điều đó, ngoài COUNT(*)

- Với trường hợp biểu thức đại số trên các hàm thống kê hoặc cột gộp nhóm (ii và iii), tách chúng ra và lưu thành các cột riêng lẻ Khi

Trang 40

cần, ta có thể thực hiện tái tạo một cách rất đơn giản biểu thức ban đầu

từ các cột được lưu trong KNT

COUNT(E), khi cần có thể tính một cách rất đơn giản, AVG(E) = SUM(E)/COUNT(E) Vậy, đề xuất chuyển AVG(E) thành SUM(E) và COUNT(E) trong truy vấn tạo KNT Nếu E được xác định từ siêu dữ liệu là không thể NULL, thì COUNT(E) và COUNT(*) tương đương nhau Khi đó, không cần lưu COUNT(E) mà chỉ cần lưu COUNT(*) Biến đổi W và J về dạng chuẩn tắc hội: (…OR…) AND…AND (…OR…) Việc biến đổi này nhằm hai mục đích, đó là i) so sánh mệnh

đề W/J giữa các truy vấn và ii) xác định cập nhật trên BG có liên quan đến KNT hay không i) Việc so sánh hai biểu thức luận lý là không hề đơn giản Nghiên cứu [2] đề xuất so sánh hai biểu thức luận lý theo nguyên tắc chuyển về dạng chuẩn tắc hội, sau đó sắp xếp theo thứ tự từ điển và so sánh ii) Ở dạng chuẩn tắc này, W/J chỉ cho giá trị TRUE nếu tất cả các mệnh đề cấu thành đều cho giá trị TRUE Nếu một bản ghi nào đó không thoả một mệnh đề thành phần bất kỳ đều không có tác động đến kết quả thực thi truy vấn Q Để đơn giản hoá, ta đưa vào các ký hiệu: C = W AND J

b Thuật toán cập nhật gia tăng

Sự kiện thay đổi dữ liệu trong các BG được chia theo ba loại thao tác: Thêm mới (insert), cập nhật (update) và xoá (delete) một tập các bản ghi Nếu xét trên phương diện bản ghi của các bảng, thì các bản ghi là không trùng nhau Tuy nhiên, nếu xét trên phương diện chỉ các bộ giá trị tương ứng với một tập các cột, thì các bộ giá trị này có thể trùng nhau Ta gọi các “tập” này là các túi Hầu hết các công trình liên quan CNGT KNT đã công bố trước đây xem trường hợp thao tác cập nhật (update) tương đương với việc xoá một túi các bản ghi và sau đó thêm mới một túi các bản ghi [2, 6] Tuy nhiên, việc chia tách này không phải bao giờ cũng tốt hơn

Trong trường hợp truy vấn không bao gồm các hàm thống kê MIN(E), MAX(E), ta có thể không cần phải phân tích update thành insert và

Ngày đăng: 05/05/2021, 16:19

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w