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

Cập nhật gia tăng bất đồng bộ khung nhìn thực trong hệ quản trị cơ sở dữ liệu PostgresQL

58 32 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 đề Cập Nhật Gia Tăng Bất Đồng Bộ Khung Nhìn Thực Trong Hệ Quản Trị Cơ Sở Dữ Liệu PostgresQL
Tác giả Trần Trọng Nhâ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 Công nghệ thông tin
Thể loại khóa luận tốt nghiệp
Năm xuất bản 2015
Thành phố Đà Nẵng
Định dạng
Số trang 58
Dung lượng 570,78 KB

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

Nội dung

Để có thể sử dụng, KNT phải được ở trạng thái cập nhật mới nhất thực tiễn, bởi vì dữ liệu trên các bảng gốc BG – các bảng tham gia vào truy vấn gốc – truy vấn tạo KNT thay đổi liên tục t

Trang 1

TRƯỜNG ĐẠI HỌC SƯ PHẠM

Trang 2

LỜI CAM ĐOAN

Tôi xin cam đoan:

• Những nội dung trong luận văn tốt nghiệp này là do tôi thực hiện dưới

sự hướng dẫn trực tiếp của giảng viên hướng dẫn

• Mọi tham khảo dùng trong luận văn này đều được trích dẫn rõ ràng tên tác giả, tên công trình, thời gian và địa điểm công bố

Sinh viên thực hiện

Trần Trọng Nhân

Trang 3

LỜI CẢM ƠN

Tôi xin gửi lời cảm ơn đến Ban lãnh đạo nhà trường, cùng khoa Tin học – Trường Đại học Sư phạm Đà Nẵng, đã tạo điều kiện cho tôi được thực hiện khóa luận tốt nghiệp

Xin cảm ơn các thầy cô giảng viên đã nhiệt tình dạy dỗ trong bốn năm ngồi ghế giảng đường Đặc biệt là thầy Nguyễn Trần Quốc Vinh, người đã trực tiếp hướng dẫn tôi thực hiện bài khóa luận tốt nghiệp này

Mặc dù đã cố gắng hoàn thiện đề tài với tất cả nỗ lực của bản thân song chắc chắn không tránh khỏi những thiếu sót, rất mong nhận được sự đóng góp

ý kiến của thầy cô và các bạn

Cuối cùng, tôi xin kính chúc quý thầy cô lời chúc sức khoẻ, hạnh phúc

và thành công trong công tác cũng như trong cuộc sống

Xin trân trọng cảm ơn!

Sinh viên thực hiện

Trần Trọng Nhân

Trang 4

NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

Đà Nẵng, ngày tháng năm 2015

Chữ ký của GVHD

Trang 5

MỤC LỤC

DANH MỤC VIẾT TẮT vi

DANH MỤC HÌNH VẼ vii

DANH MỤC BẢNG BIỂU viii

MỞ ĐẦU 1

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

2 Mục tiêu nghiên cứu 2

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

4 Kết cấu đề tài 3

CHƯƠNG 1 CƠ SỞ LÝ THUYẾT 4

1.1 KHUNG NHÌN THỰC 4

1.2 HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU POSTGRESQL 4

1.3 GIỚI THIỆU VỀ TRIGGER NGÔN NGỮ C TRONG POSTGRESQL 6

1.3.1 Hàm nạp động 7

1.3.2 Trigger sử dụng hàm nạp động 8

1.4 SINH TỰ ĐỘNG MÃ NGUỒN TRIGGER NGÔN NGỮ C 8

1.4.1 Mã cố định 8

1.4.2 Mã tùy biến 9

1.5 THUẬT TOÁN CẬP NHẬT GIA TĂNG KHUNG NHÌN THỰC 13

1.5.1 Tạo khung nhìn thực 14

1.5.2 Thực hiện cập nhật 15

1.5.3 Thuật toán cải tiến cho một số trường hợp 18

CHƯƠNG 2 PHÂN TÍCH VÀ THIẾT KẾ 21

2.1 MÔ HÌNH TỔNG QUAN HỆ THỐNG 21

2.2 PHÂN TÍCH THÔNG TIN 22

2.2.1 Phân tích thông tin đầu vào 22

2.2.2 Phân tích siêu dữ liệu (meta-data) 23

2.2.3 Phân tích và tiền xử lý các thành phần liên quan mã nguồn C 24

2.2.4 Phân tích dữ liệu điều kiện đối chiếu thuật toán 25

2.3 QUẢN LÝ CẬP NHẬT BẤT ĐỒNG BỘ 25

Trang 6

2.4 SINH TỰ ĐỘNG CÁC ĐƠN VỊ QUẢN LÝ 26

2.4.1 Sinh tự động các bảng 26

2.4.2 Sinh tự động các trigger biên sử 27

2.5 TỐI ƯU HÓA LỊCH SỬ CẬP NHẬT 27

2.5.1 Thuật toán tối ưu hóa lịch sử cập nhật 27

2.5.2 Các trường hợp lược bỏ hoặc thay thế bản lưu 30

2.6 CẬP NHẬT GIA TĂNG BẤT ĐỒNG BỘ KHUNG NHÌN THỰC 31

2.6.1 Sự kiện thêm mới 32

2.6.2 Sự kiện xóa 32

2.6.3 Sự kiện cập nhật 33

CHƯƠNG 3 CÀI ĐẶT CHƯƠNG TRÌNH VÀ THỬ NGHIỆM 35

3.1 MÔ-ĐUN SINH TỰ ĐỘNG SCHEMA QUẢN LÝ CẬP NHẬT BẤT ĐỒNG BỘ KHUNG NHÌN THỰC VÀ TRIGGER BIÊN SỬ 35

3.2 BỘ CẤU HÌNH BIÊN DỊCH MÃ NGUỒN C TRÊN HỆ ĐIỀU HÀNH WINDOWS 36

3.3 MÔ-ĐUN CẬP NHẬT GIA TĂNG BẤT ĐỒNG BỘ KHUNG NHÌN THỰC 38 3.4 ĐÁNH GIÁ HIỆU SUẤT 39

3.4.1 Truy vấn gốc thử nghiệm 39

3.4.2 Cấu trúc và kích thước các bảng gốc 40

3.4.3 Hiệu quả đạt được khi sử dụng KNT 41

3.4.4 Thời gian chạy trigger 41

3.4.5 Thời gian cập nhật gia tăng bất đồng bộ khung nhìn thực 42

KẾT LUẬN 43

TÀI LIỆU THAM KHẢO 44

PHỤ LỤC A: MÃ NGUỒN TRIGGER BIÊN SỬ ĐƯỢC SINH TỰ ĐỘNG 45

PHỤ LỤC B: KỊCH BẢN SQL CHO TRIGGER TRÊN CÁC BẢNG GỐC 49

Trang 8

DANH MỤC HÌNH VẼ

Hình 2.1 – Sơ đồ tổng quan hoạt động hệ thống 21

Hình 2.2 – Phân tích thông tin đầu vào 22

Hình 2.3 – Phân tích siêu dữ liệu 23

Hình 2.4 – Phân tích và tiền xử lý C 24

Hình 2.5 – Phân tích dữ liệu điều kiện đối chiếu thuật toán 25

Hình 2.6 – Sơ đồ khối thuật toán tổng quan tối ưu hóa bản lưu 29

Trang 9

DANH MỤC BẢNG BIỂU

Bảng 1.1 – Giới hạn khả năng của HQT CSDL PostgreSQL 6

Bảng 3.1 – Kích thước các bảng gốc tham gia vào truy vấn 41

Bảng 3.2 – Hiệu quả khi sử dụng KNT 41

Bảng 3.3 – Thời gian chạy trigger 41

Bảng 3.4 – Thời gian cập nhật gia tăng bất đồng bộ khung nhìn thực 42

Trang 10

MỞ ĐẦU

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

Sử dụng khung nhìn thực (KNT) là một cách nhanh nhất để thực hiện lệnh truy vấn, có thể nói là KNT cho kết quả ngay tức thời bất kể độ phức tạp của truy vấn và độ lớn của cơ sở dữ liệu (CSDL)

Để có thể sử dụng, KNT phải được ở trạng thái cập nhật mới nhất (thực tiễn), bởi vì dữ liệu trên các bảng gốc (BG – các bảng tham gia vào truy vấn gốc – truy vấn tạo KNT) thay đổi liên tục theo thời gian nên kết quả của truy vấn cũng thay đổi theo, dẫn đến dữ liệu trong KNT khi đó bị hết hạn (không còn thực tiễn), mất khả năng trả lời truy vấn một cách chính xác Lý tưởng nhất

là việc cập nhật (thực tiễn hóa) KNT luôn được diễn ra liên tục, nhằm đáp ứng được nhu cầu truy vấn kết quả với tần suất cao Cơ chế cập nhật gia tăng đồng

bộ KNT bằng trigger cho hệ quản trị (HQT) CSDL PostgreSQL ở công trình nghiên cứu [2] cho phép cho phép chúng ta thực hiện được việc đó, xem việc cập nhật KNT là một phần trong thao tác thực hiện cập nhật dữ liệu ở các BG

Tuy vậy, ở một số trường hợp tùy thuộc vào đặc thù vấn đề đưa ra và cách thức khai thác dữ liệu, KNT không cần phải luôn luôn sẵn sàng Chẳng hạn như khai báo thêm điểm một môn học nào đó cho sinh viên hầu như không gây ra

sự thay đổi nào đáng kể đến điểm trung bình cho toàn khoa, toàn ngành; bán thêm vài món hàng không ảnh hưởng đến doanh thu toàn cầu, châu lục, từng vùng hay thậm chí doanh thu theo quốc gia [1] Khi đó, có thể trì hoãn cập nhật KNT một khoảng thời gian kể từ khi dữ liệu thay đổi hoặc ở tại một thời điểm nhất định nào đó, ít nhất là ở thời điểm KNT chuẩn bị được sử dụng

Xuất hiện từ những năm 1980, nhưng đến thời điểm hiện tại, KNT chỉ được hỗ trợ hoàn toàn ở một số HQT CSDL lớn như Microsoft SQL Server, Oracle DB2,… Còn ở các HQT CSDL mã nguồn mở, KNT chưa được phát

Trang 11

triển, điển hình như là PostgreSQL – một HQT CSDL mạnh và được Bộ Thông tin và Truyền thông có thông tư khuyến cáo ưu tiên sử dụng [2], có hỗ trợ KNT tuy nhiên chỉ cho phép thao tác cập nhật ở mức toàn phần bất đồng bộ, nghĩa

là thực thi lại truy vấn để cập nhật KNT tại một thời điểm nhất định Khó khăn được xác định ở việc thực hiện cập nhật gia tăng (CNGT) KNT, là thao tác thực hiện các cập nhật dữ liệu (thêm mới, sửa, xóa) ngay trên KNT ứng với từng thay đổi trên các bảng gốc (BG – các bảng tham gia vào truy vấn gốc – truy vấn tạo KNT) nhằm đưa KNT vào trạng thái thực tiễn (đã cập nhật ở trạng thái mới nhất)

Đề tài CNGT bất đồng bộ KNT sẽ hiện thực hóa giải pháp cập nhật bất đồng bộ nói trên cho HQT CSDL PostgreSQL, giúp cho người quản trị CSDL

có thêm sự lựa chọn khi sử dụng KNT ngoài khả năng CNGT đồng bộ đã đưa

ra ở công trình nghiên cứu [2] cho HQT CSDL này, cho phép tối ưu hóa hiệu suất của hệ thống tùy theo bài toán đặt ra và góp một phần nhỏ đưa KNT vào

sử dụng phổ biến hơn trong cách thức truy vấn dữ liệu

2 Mục tiêu nghiên cứu

Đề tài đề xuất cơ chế ghi lại và tối ưu hóa lịch sử thay đổi dữ liệu phục vụ cho việc CNGT bất đồng bộ, nhằm giúp cho việc lưu trữ và sử dụng các thông tin đó một cách hiệu quả nhất, có thể sử dụng lại để cập nhật cho tất cả KNT được tạo ra trong cùng một CSDL

Đề tài hướng đến mục tiêu xây dựng chương trình phục vụ cho việc CNGT bất đồng bộ KNT Chương trình có khả năng tích hợp được vào HQT CSDL PostgreSQL như một mô-đun chức năng hoặc được gọi như một lệnh cập nhật

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

Với thời gian nghiên cứu trong khoảng ba tháng, đề tài tập trung vào phân tích và xử lý các truy vấn select chứa phép nối trong (inner join), không chứa

Trang 12

các truy vấn lồng hoặc đệ quy Giải pháp đề tài đưa ra chủ yếu thực hiện CNGT bất đồng bộ KNT trên HQT CSDL PostgreSQL, nhằm tạo tiền đề để có thể thực hiện trên các HQT CSDL mã nguồn mở tương tự khác

4 Kết cấu đề tài

Đề tài được trình bày trong ba chương:

 Chương 1 – Cơ sở lý thuyết trình bày về các khái niệm cơ bản của các đối tượng mà khóa luận nghiên cứu, cũng như các cơ chế, thuật toán

đã được nghiên cứu trước đó mà khóa luận sử dụng

 Chương 2 – Phân tích và thiết kế đưa ra mô hình tổng quát của hệ thống, đi sâu vào trình bày cấu trúc các mô-đun chính và cơ chế, thuật toán cho các phần chức năng như phân tích thông tin, tối ưu lịch sử cập nhật, CNGT bất đồng bộ

 Chương 3 – Kết quả đạt được mô tả chương trình đã được thực hiện, bao gồm hai mô-đun chính và một dự án biên dịch phụ trợ Chương này đề cập đến cấu hình, input, output và cách sử dụng của các phần nêu trên

Trang 13

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) [1] Cập nhật hoàn toàn thực tế là tạo lại KNT 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 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 Cập nhật ép buộc nghĩa là khi có khả năng thì thực hiện cập nhật gia tăng, còn nếu không thì sử dụng cập nhật hoàn toàn [1]

1.2 HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU POSTGRESQL

Đề tài hướng đến mục tiêu chung là những HQTCSDL mã nguồn mở và

có hỗ trợ trigger trong ngôn ngữ C Cụ thể, HQTCSDL PostgreSQL đã được lựa chọn để thực hiện và cụ thể hóa nghiên cứu này bởi có đặc điểm nêu trên cùng với sự mạnh mẽ của nó, ngoài ra PostgreSQL được Bộ Thông tin và

Trang 14

Truyền thông khuyến cáo ưu tiên lựa chọn để làm HQTCSDL (thông tư số 49/2009/TT-BTTTT) [2]

Sơ lược về lịch sử và phát triển cùng các điểm mạnh của PostgreSQL: PostgreSQL là một HQTCSDL quan hệ và đối tượng dựa trên POSTGRES, bản 4.2, được khoa điện toán của đại học California tại Berkeley phát triển POSTGRES mở đường cho nhiều khái niệm quan trọng mà các HQTCSDL thương mại rất lâu sau mới có Được viết theo hướng mã nguồn mở và rất mạnh

mẽ, PostgreSQL đã có hơn vài thập niên phát triển, đồng thời kiến trúc đã được kiểm chứng và tạo được lòng tin với người sử dụng về độ tin cậy, tính toàn vẹn

dữ liệu, và tính đúng đắn

PostgreSQL có thể chạy trên tất cả các hệ điều hành, bao gồm cả Linux, UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64), và Windows Do nó hoàn toàn tuân thủ ACID, có hỗ trợ đầy đủ các foreign keys, joins, views, triggers, và stored procedures (trên nhiều ngôn ngữ) Ngoài các kiểu dữ liệu SQL 2008 như INTEGER, NUMBER, BOOLEAN, CHAR, VARCHAR, DATE INTERVAL và TIMESTAMP, PostgreSQL còn hỗ trợ lưu trữ các đối tượng có kiểu dữ liệu nhị phân lớn, bao gồm cả hình ảnh, âm thanh, hoặc video PostgreSQL tự hào có các tính năng phức tạp như kiểm soát truy cập đồng thời nhiều phiên bản (MVCC), khôi phục dữ liệu tại từng thời điểm (Recovery), quản lý dung lượng bảng (tablespaces), sao chép không đồng bộ, giao dịch lồng nhau (savepoints), sao lưu trực tuyến hoặc nội bộ, truy vấn phức tạp và tối ưu hóa, và viết trước các khai báo để quản lý và gỡ lỗi PostgreSQL

hỗ trợ bộ ký tự quốc tế, hỗ trợ bảng mã nhiều byte, Unicode, và cho phép định dạng, sắp xếp và phân loại ký tự văn bản (chữ hoa, thường)

PostgreSQL còn được biết đến với khả năng mở rộng để nâng cao cả về

số lượng dữ liệu quản lý và số lượng người dùng truy cập đồng thời Đã từng

Trang 15

có những hệ thống PostgreSQL hoạt động trong môi trường thực tế thực hiện quản lý vượt quá 4 terabyte dữ liệu

Dung lượng tối đa của CSDL Không giới hạn

Dung lượng bảng tối đa 32 TB

Dung lượng cột tối đa 1.6 TB

Dung lượng trường tối đa 1 GB

Số lượng hàng tối đa mỗi bảng Không giới hạn

Số lượng cột tối đa mỗi bảng 250 – 1600 tùy thuộc vào loại cột Chỉ số tối đã mỗi bảng Không giới hạn

Bảng 1.1 – Giới hạn khả năng của HQT CSDL PostgreSQL

PostgreSQL theo chuẩn SQL99 , được phổ biến bằng giấy phép BSD cổ điển Nó không quy định những hạn chế trong việc sử dụng mã nguồn của phần mềm Bởi vậy PostgreSQL có thể được dùng, sửa đổi và phổ biến bởi bất kỳ ai cho bất kỳ mục đích nào PostgreSQL cũng là HQTCSDL hỗ trợ mạnh trong việc lưu trữ dữ liệu không gian PostgreSQL kết hợp với mô-đun Postgis cho phép người dùng lưu trữ các lớp dữ liệu không gian Khi sử dụng PostgreSQL, Postgis kết hợp với các phần mềm GIS hỗ trợ hiển thị, truy vấn, thống kê hoặc

xử lý dữ liệu không gian

1.3 GIỚI THIỆU VỀ TRIGGER NGÔN NGỮ C TRONG

POSTGRESQL

Trigger trong CSDL là một tập các câu lệnh SQL có cấu trúc, được thực thi một cách tự động mỗi khi có một sự kiện nhất định xảy ra trên bảng hoặc khung nhìn trong CSDL Trigger thường được sử dụng để duy trì sự toàn vẹn thông tin trong CSDL Trong PostgreSQL, trigger có các đặc điểm sau [2]:

Trang 16

 Trigger sẽ được gọi mỗi khi có một dòng dữ liệu thay đổi, điều đó có nghĩa là khi có sự thay đổi với n dòng dữ liệu, trigger cũng sẽ được gọi

n lần

 Trên một bảng có thể định nghĩa nhiều trigger cho một sự kiện, cũng như

có thể định nghĩa một trigger cho nhiều sự kiện, do có cơ chế kiểm tra

sự kiện (insert/delete/update) và kiểm tra thời gian gọi (trước/sau thay đổi) bên trong trigger

 Trigger trong PostgreSQL có thể được viết bằng nhiều ngôn ngữ khác nhau

Viết trigger ngôn ngữ C trong PostgreSQL thường không được khuyến khích, PostgreSQL thường đề nghị người dùng xem xét sử dụng một ngôn ngữ thủ tục khác (ví dụ như PL/pgSQL) Tuy vậy, với việc dùng trigger để cập nhật KNT, nghiên cứu này chủ ý sinh trigger trong ngôn ngữ C để tối ưu hóa thời gian cập nhật nhiều nhất có thể

1.3.1 Hàm nạp động

Hàm người dùng tự viết bằng ngôn ngữ C có thể được biên dịch thành các thư viện chia sẻ (shared library/dynamically loadable object), và được nạp vào server trong thời gian chạy (mỗi khi có lời gọi hàm) Các tệp thư viện cần

được đặt vào trong thư mục lib trong cây thư mục cài đặt PostgreSQL, sau đó

dùng lệnh SQL khai báo hàm liên kết đến tệp thư viện đó PostgreSQL đưa ra các quy ước chung cũng như các thư viện và macro có sẵn để viết hàm, hỗ trợ thực hiện một số thủ tục như kiểm tra ngữ cảnh, lấy tham số truyền vào, trả về giá trị cho hàm,… Các kiểu dữ liệu trong SQL cũng được biểu diễn tương ứng bằng các kiểu dữ liệu trong C, có thể là kiểu nguyên thủy hoặc kiểu cấu trúc (struct) Ngoài ra, PostgreSQL còn cho phép người dùng có thể thực hiện truy

Trang 17

vấn SQL tới CSDL ngay trong thân hàm nhờ giao diện lập trình server SPI (Server Programming Interface)

1.3.2 Trigger sử dụng hàm nạp động

Trigger có thể được định nghĩa thông quá các hàm nạp động đã được khai báo Cụ thể, sau khi khai báo hàm nạp động trên PostgreSQL (tên hàm, tên tệp thư viện, tên hàm được định nghĩa trong tệp thư viện), cần thực hiện khai báo tiếp trigger: tên trigger, tên bảng, sự kiện gọi trigger, tên hàm thực thi (hàm nạp động đã được khai báo ở bước trên) Hàm trigger ngoài việc được viết theo dạng một hàm nạp động thì cần tuân thủ thêm các quy ước sau:

 Hàm được khai báo trả về kiểu trigger trong PostgreSQL

 Kiểm tra lời gọi hàm có hợp lệ hay không? (Có được gọi từ trigger manager hay không?)

 Về mặt kĩ thuật, xác định giá trị trả về của hàm C đối với các sự kiện tương ứng

1.4 SINH TỰ ĐỘNG MÃ NGUỒN TRIGGER NGÔN NGỮ C

Mã nguồn trigger được chia thành hai phần, phần mã cố định và phần mã tùy biến Mã cố định là những dòng mã giống nhau cho mọi trigger, được xây dựng thành khung (frame) và viết thẳng vào tệp mã nguồn trong quá trình sinh

mà không cần phân tích Phần mã tùy biến là phần chính trong quá trình sinh

tự động Để xác định được phần này, cần thực hiện phân tách câu TVG thành các thành phần nhỏ hơn, từ đó thực hiện phân tích các thông tin cần thiết từ siêu dữ liệu

1.4.1 Mã cố định

Phần này được tổng hợp dựa trên các quy tắc lập trình C, các quy ước khi lập trình hàm trigger bằng ngôn ngữ C chạy trong PostgreSQL và dựa trên

Trang 18

việc quan sát các mã nguồn trigger có sẵn, từ đó trích xuất các phần giống nhau thành bộ khung chung, bao gồm một số dòng mã như sau:

 Khai báo các thư viện (included header files)

 Khai báo các biến điều khiển

 Kiểm tra lời gọi hàm, kiểm tra dòng dữ liệu NULL

 Xác định giá trị trả về cho hàm trigger đối với các sự kiện insert/delete hoặc update (trigger cho sự kiện insert/delete sẽ trả về dòng dữ liệu được thêm mới/xóa, đối với sự kiện update thì trigger trả về dòng dữ liệu mới (NEW))

 Kết nối/ngắt kết nối đến SPI (Server Programming Interface – cho phép trigger có thể chạy các truy vấn trong thân hàm)

1.4.2 Mã tùy biến

Không tính phần mã cố định đã đề cập, phần mã mềm của các trigger cũng bao gồm những phần giống và khác nhau nhất định So sánh mã nguồn của các trigger, ta có thể dễ dàng nhận thấy, đối với các trigger trên cùng một bảng thì danh sách biến và đoạn mã kiểm tra điều kiện ban đầu là giống nhau; đối với các trigger cho cùng một loại sự kiện thì sẽ có các thao tác giống nhau dựa trên thuật toán CNGT KNT Do vậy, trước tiên ta cần phải phân tích TVG,

từ đó xác định danh sách biến (dựa vào mệnh đề S) và biểu thức điều kiện ban đầu (dựa vào các mệnh đề J, W) cho các bảng tham gia vào truy vấn, rồi áp dụng những khuôn mẫu CNGT từ thuật toán đã đề cập để sinh mã trigger cho từng sự kiện trên mỗi bảng

 Phân tích truy vấn

Câu truy vấn được phân tách thành các thành phần nhỏ hơn và được lưu vào một kiểu dữ liệu struct Các thành phần này được sử dụng tiếp để thực hiện quá trình phân tích các thông tin cần thiết, ngoài ra nó còn được biến đổi cho phù hợp với thuật toán CNGT (nhưng không làm ảnh hưởng đến kết quả của TVG) Để có thể phân tích thông tin, module

Trang 19

sử dụng giao diện lập trình C (C application programmer’s inteface) mà PostgreSQL cung cấp để có thể truy vấn tới meta data của các bảng trong CSDL, nhằm mục đích lấy các thông tin như kiểu dữ liệu, số thứ tự của các cột, danh sách khóa chính,…

 Trên mệnh đề S: Các thành phần trong mệnh đề này (cột, biểu thức toán học) được lưu vào một mảng các cấu trúc kiểu cột, cấu trúc này quản lí các thông tin của một cột như: tên (hoặc biểu thức toán học nếu không là cột thực), kiểu dữ liệu, bảng chứa, độ dài (nếu thuộc các kiểu dữ liệu kí tự), số thứ tự của cột trong bảng tương ứng, có là khóa chính hay không, tên biến đại diện cho cột trong mã C,… Ngoài ra, một thành phần tương ứng với cột COUNT(*) cũng được tự động thêm vào, và nếu như có cột tính AVG(E) xuất hiện trong mệnh đề select thì nó cũng sẽ được thay bằng 2 thành phần tương ứng với 2 cột SUM(E) và COUNT(E) (theo như thuật toán CNGT đã đề cập) Danh sách các thành phần cột này được dùng để xác định danh sách biến dữ liệu trong hàm trigger

 Trên các mệnh đề W, J: Các mệnh đề này được phân tách thành các biểu thức so sánh riêng biệt, sau đó ta lọc ra các biểu thức (theo dạng chuẩn hội) có chứa các cột chỉ nằm trên bảng xảy

ra sự kiện Tương tự như với các cột ở mệnh đề S, ta cũng cần xác

định các thông tin của các cột nằm trong biểu thức đã được lọc Tập các biểu thức này dùng để xác định điều kiện ban đầu trong hàm trigger

 Danh sách biến

Trong hàm trigger có các biến được sử dụng, được chia thành 2 loại:

Trang 20

 Biến điều khiển: Các biến này dùng để quản lí, kiểm tra trạng thái của các tác vụ trong trigger, cũng như lưu các giá trị tạm thời (ví dụ như kết quả truy vấn), chạy vòng lặp,… Biến điều khiển

là thành phần giống nhau ở mọi trigger, vì vậy nó được khai báo ở phần cứng

 Biến dữ liệu: Các biến này được khai báo để chứa dữ liệu cho các cột tham gia truy vấn, được khai báo ở mã mềm của trigger Một tên biến chỉ tương ứng với duy nhất một cột nhất định

và có kiểu dữ liệu trong ngôn ngữ C tương đồng với kiểu dữ liệu của cột đó trong CSDL Để xác định được danh sách các biến dữ liệu, ta duyệt qua các cột được chọn (đã qua phân tích) ở mệnh đề

S, mỗi cột tương ứng với một biến, các biến này chứa dữ liệu cho các trường trong KNT Ngoài ra, còn có các biến dữ liệu tương ứng với danh sách cột trong BG, các biến này đóng vai trò chứa

dữ liệu để kiểm tra điều kiện ban đầu và xác định dòng dữ liệu ở bước chạy lại TVG

 Điều kiện ban đầu

Như đã đề cập ở phần phân tích, điều kiện này giúp kiểm tra ngay

từ ban đầu xem một sự thay đổi trên BG có là cần thiết để cập nhật KNT hay không Để sinh mã kiểm tra điều kiện ban đầu, ta dùng toán tử AND nối các biểu thức đã được lọc ra tạo thành một biểu thức logic Biểu thức này được đưa vào phần điều kiện của câu lệnh “if” quyết định xem có thực hiện tiếp hay thoát khỏi hàm trigger

 Các khuôn mẫu CNGT cho từng sự kiện

Điều quan trọng trong việc dùng trigger để CNGT là phải xác định được thời gian gọi trigger cho từng sự kiện tương ứng Đối với sự kiện insert, trigger phải được gọi sau khi sự kiện xảy ra; đối với sự kiện delete,

Trang 21

trigger phải được gọi trước khi sự kiện xảy ra (và có thể được gọi lại sau khi sự kiện xảy ra đối với trường hợp có xuất hiện hàm thống kê min hoặc max, theo thuật toán CNGT đồng bộ KNT); tuy nhiên đối với sự kiện update, do thuật toán CNGT xem sự kiện này như 2 thao tác delete rồi insert riêng biệt, nên trigger cho sự kiện update phải được gọi cả trước

và sau khi sự kiện này xảy ra Để đặt thời gian gọi trigger cho từng sự kiện tương ứng, ta có thể:

i) Xây dựng mã trigger cho tất cả các sự kiện trong một hàm duy nhất, khai báo gọi hàm đó như trigger cho trước và sau tất cả các sự kiện trên bảng, rồi trong thân hàm, ta sẽ xác định thời gian gọi trigger để thực thi đoạn mã tương ứng

ii) Xây dựng riêng rẽ một hàm cho mỗi trigger, sau đó xác định thời gian, sự kiện gọi nó ở phần khai báo trigger trong CSDL

Việc xác định thời gian gọi trigger là để đảm bảo tính đúng đắn của bước truy vấn lại TVG, là một phần trong thuật toán CNGT KNT Ở đây cần phần biệt giữa bước này và phương pháp cập nhật hoàn toàn (complete) ở chỗ, đối với bước truy vấn lại của thuật toán CNGT đồng

bộ KNT đang xét, mệnh đề W của TVG được xác định thêm các điều kiện là các trường khóa của dòng dữ liệu đang xảy sự kiện với dữ liệu cụ thể Bước này nhằm mục đích:

i) Nối bảng đang xảy ra sự kiện với các bảng khác trong tập các BG để lấy thông tin các trường khác trong KNT

ii) Lấy các dữ liệu liên quan thay đổi trên BG để cập nhật lại vào KNT

Kiểm tra lại các điều kiện khác trong mệnh đề J, W và H nếu có

Trang 22

1.5 THUẬT TOÁN CẬP NHẬT GIA TĂNG KHUNG NHÌN THỰC

Thuật toán CNGT đồng bộ KNT được tham khảo từ công trình nghiên cứu [2] Thuật toán này chưa quan tâm đến KNT được tạo đượ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 Trích dẫn lại thuật toán như sau:

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ừ bảng gốc 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 bảng gốc T1, T2…Tn được sử dụng trong truy vấn

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 (T jdelk ): túi các bản ghi (từ đây về sau, túi các bản ghi có nghĩa là “tập”

có thể chứa các phần tử trùng lặp) được thêm vào (xoá từ) BG T j k;

T

>): một bản ghi trong tập

ins

k j

T

(

del

k j

T

);

Trang 23

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ừ bảng gố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ừ bảng gốc 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ậy, nghiên cứu đề xuất thực hiện một số biến đổi truy vấn trong quá trình tạo KNT:

- Tự động thêm COUNT(*) vì COUNT(*) giúp ta xác định khi nào 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

Trang 24

vậy, không có trường hợp nào của 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 cần, ta có thể thực hiện tái tạo biểu thức ban đầu từ các cột được lưu trong KNT

- Với trường hợp hàm AVG(E), đề xuất lưu riêng lẻ SUM(E) và 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, 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/H giữa các truy vấn và ii) xác định cập nhật trên bảng gốc 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 Trong phạm

vi nghiên cứu này, tác giả đề 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

1.5.2 Thực hiện cập nhật

Sự kiện thay đổi dữ liệu trong các bảng gốc đượ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

Trang 25

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 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, MAX, ta có thể không cần phải phân tích update thành insert và delete Trong trường hợp truy vấn bao gồm các hàm thông kê MIN, MAX, thì việc phân tích update thành insert và delete là hiển nhiên Với insert, ta không cần quan tâm đến dữ liệu trong các bảng gốc, vì giá trị được thêm vào có thể thay thế giá trị MIN, MAX hiện tại bằng cách so sánh với giá trị trong bảng KNT Với delete,

rõ ràng, nếu xoá bản ghi có giá trị trường đang là MIN hoặc MAX, thì ta phải tìm lại giá trị MIN, MAX mới từ các bảng gốc Về cách thức tham gia của bảng gốc vào truy vấn, ta xét hai trường hợp a) một số cột tạo nên khoá của của bảng gốc Ti tham gia vào truy vấn có ở G và b) tất cả các trường hợp còn lại

Để đơn giản hoá, ta đưa vào các ký hiệu: C = W ^ J

B1 Loại từ dTinew những bản ghi không thoả C Tất nhiên, những bản ghi không thoả W không thể có tác động kết kết quả thực thi nên ta không cần thiết xét các bản ghi đó, có thể loại ngay từ đầu Thường thì J chứa các điều kiện kiểu Ti.C1 = Tj.C2 Tuy nhiên, trong một số trường hợp, J

có thể bao gồm cả điều kiện lọc thông thường Ở bước này, ta chỉ có thể lọc các bản ghi áp dụng các điều kiện trong C chỉ liên quan đến Ti Việc loại bỏ các bản ghi ở bước này giúp giảm số lượng bản ghi tham gia vào phép nối ở B2

B2 Nối tập dTinew thu được với các bảng còn lại trong T, thu được kết quả dQi

Trang 26

B3 Xét mỗi bản ghi trong dQi, nếu bản ghi thoả C, thì chọn các cột tương ứng tham gia vào S, thực hiện các biểu thức và cập nhật Tmv theo nguyên tắc:

- Nếu chưa có bản ghi dạng (G, S-G), thêm mới bản ghi

- SUM(E) = SUM(E) + dSUM(E) Trong đó, E là biểu thức dSUM(E) là SUM(E) trên dQi COUNT(E) = COUNT(E) + dCOUNT(E) dSUM(E) là SUM(E) trên dQi

- Nếu MIN(E) > dMIN(E), nghĩa là bản ghi đang được thêm mới sẽ tạo nên giá trị MIN(E) cho nhóm, thì MIN(E) = dMIN(E) Ngược lại, MIN(E) không thay đổi dMIN(E) là MIN(E) trên dQi

- Nếu MAX(E) < dMAX(E), nghĩa là bản ghi đang được them mới

sẽ tạo nên giá trị MAX(E) mới cho nhóm, MAX(E) = dMAX(E) Ngược lại, MAX(E) không thay đổi dMAX(E) là MAX(E) trên dQi

- Thay vì lưu AVG(E), ta lưu SUM(E) và COUNT(E) Khi xuất hiện truy vấn có AVG(E), ta tính AVG(E) = SUM(E)/COUNT(E)

B1 Loại từ dTiold những bản ghi không thoả W và không thoả H

B2 Nối tập dTiold với các bảng còn lại, thu được kết quả dQi

B3 Xét mỗi bản ghi trong dQi Nếu bản ghi nào thoả W và H, thì chọn các cột tương ứng, thực hiện các biểu thức và thêm vào Tmv theo nguyên tắc:

- SUM(E) = SUM(E) - dSUM(E)

- COUNT(E) = COUNT(E) - dCOUNT(E)

- Nếu MIN(E) == dMIN(E), nghĩa là bản ghi đang được xoá tạo nên giá trị MIN(E) của nhóm, ta tính lại MIN(E) dựa trên các bảng gốc Ngược lại, MIN(E) không thay đổi

Trang 27

- Nếu MAX(E) == dMAX(E), nghĩa là bản ghi đang được xoá tạo nên giá trị MAX(E), ta tính lại MAX(E) dựa trên các bảng gốc Ngược lại, MAX(E) không thay đổi

Nếu chỉ có COUNT(*) = 0, nghĩa là không còn bản ghi nào thuộc nhóm tham gia vào kết quả truy vấn, xoá bản ghi dạng (G, S-G) từ Tmv Tương tự, thay vì lưu AVG(E), ta lưu SUM(E) và COUNT(E), khi cần, tính

AVG(E) = SUM(E)/COUNT(E)

Update dTi = delete dTiold + insert dTinew

B1 So sánh dTiold và dTinew, loại khỏi dTiold và dTinew những bản ghi có điều chỉnh không liên quan đến Q

B2 Thực hiện như trường hợp delete với dTiold

B3 Thực hiện như trường hợp insert với dTinew

1.5.3 Thuật toán cải tiến cho một số trường hợp

a.) Không xem xét tách sự kiện update thành các sự kiện delete và insert Như đã lý luận ở trên, nếu trong truy vấn chỉ bao gồm các hàm SUM(E)

và COUNT(E), không xem xét trường hợp truy vấn có MIN(E) và MAX(E), còn AVG(E) thì được tính từ SUM(E) và COUNT(E), thì có thể không cần phân tách sự kiện update thành hai sự kiện insert và delete riêng biệt Ta vẫn xem xét 2 tập: Tập tất cả các bản ghi với các giá trị mới (dTinew) và tập tất cả các bản ghi chứa giá trị cũ (dTiold) Các bước thực hiện CNGT như sau:

B1 Loại khỏi dTinew và dTiold các bản ghi không thoả C

B2 Thực hiện phép nối ngoài đầy đủ giữadTinew và dTiold với điều kiện nối trên một khoá của Ti và các cột của Ti tham gia vào G

B3 Nhóm theo G tập các bản ghi trong kết quả phép nối các bảng còn lại với kết quả phép nối ngoài đầy đủ giữa dTinew và dTiold

Trang 28

B4 Tính SUM(E) và COUNT(E) cho mỗi nhóm: dSUMnew(E), dSUMold(E), dCOUNTnew(E), dCOUNTold(E)

B5 Thực hiện cập nhật theo nguyên tắc:

i) SUM(E) = SUM(E) + dSUMnew(E) – dSUMold(E)

ii) COUNT = COUNT(E) + dCOUNTnew(E) – dCOUNTold(E) Với cách này, ta có thể chỉ gọi trigger một lần cho sự kiện update, thay

vì 2 lần cho mỗi sự kiện insert và delete nếu phân tách update thành hai sự kiện riêng biệt Việc nối các bảng cũng được thực hiện một lần Thao tác cập nhật KNT cũng sẽ được thực hiện một lần cho mỗi nhóm, thay vì hai lần

b.) Một số cột tạo nên khóa (khóa chính và khóa độc nhất) của bảng Ti tham gia vào G

Việc các cột nào đó có tạo nên khoá chính hay khoá nói chung hay không

có thể được xác định thông qua siêu dữ liệu(meta-data) của CSDL Nếu tất cả các cột tạo nên một khoá nào đó tham gia vào truy vấn – (Ci1, Ci2,… Cij,…, Cik),

cụ thể là ở G, khi nối BG Ti với các bảng còn lại và sau đó thực hiện gộp nhóm theo G, thì bộ giá trị <Ci1, Ci2,…Cij,…, Cik> vẫn đại diện cho một bản ghi từ

BG Ti Vậy, khi cập nhật hoặc xoá một bản ghi từ Ti, ta có thể thực hiện như sau

a) Sự kiện delete tập bản ghi dTiold từ BG Ti:

B1 Loại từ dTiold những bản ghi không thoả C

B2 Xoá từ Tmv các bản ghi thoả mãn điều kiện: dTiold.Cij = Tmv.Cij, với mọi Ci1, Ci2,…Cij,…, Cik

b) Sự kiện update tập bản ghi dTiold trong BG Ti:

Rõ ràng, một khi Ci1, Ci2,…Cij,…, Cik – những cột tạo nên khoá trong BG Ti tham gia vào G, thì có thể xảy ra hai trường hợp

- Không có cột nào của Ti tham gia vào E trong COUNT(E), SUM(E), MIN(E) hoặc MAX(E):

Trang 29

B1 Loại từ dTiold những bản ghi không thoả C

B2 Cập nhật Tmv, cập nhật bản ghi thoả mãn điều kiện: dTiold.Cij

= Tmv.Cij (với mọi Ci1, Ci2,…Cij,…, Cik): Tmv.Cij = dTinew.Cij

- Có cột của Ti tham gia vào E trong COUNT(E), SUM(E), MIN(E) hoặc MAX(E): Trong trường hợp này, ta thực hiện cập nhật như trường hợp chung

Ngày đăng: 26/06/2021, 13:12

HÌNH ẢNH LIÊN QUAN

Dung lượng bảng tối đa 32 TB - Cập nhật gia tăng bất đồng bộ khung nhìn thực trong hệ quản trị cơ sở dữ liệu PostgresQL
ung lượng bảng tối đa 32 TB (Trang 15)
2.1. MÔ HÌNH TỔNG QUAN HỆ THỐNG - Cập nhật gia tăng bất đồng bộ khung nhìn thực trong hệ quản trị cơ sở dữ liệu PostgresQL
2.1. MÔ HÌNH TỔNG QUAN HỆ THỐNG (Trang 30)
Hình 2.3 – Phân tích siêu dữ liệu - Cập nhật gia tăng bất đồng bộ khung nhìn thực trong hệ quản trị cơ sở dữ liệu PostgresQL
Hình 2.3 – Phân tích siêu dữ liệu (Trang 32)
Hình 2.4 – Phân tích và tiền xử lý C - Cập nhật gia tăng bất đồng bộ khung nhìn thực trong hệ quản trị cơ sở dữ liệu PostgresQL
Hình 2.4 – Phân tích và tiền xử lý C (Trang 33)
Hình 2.6 – Sơ đồ khối thuật toán tổng quan tối ưu hóa bản lưu - Cập nhật gia tăng bất đồng bộ khung nhìn thực trong hệ quản trị cơ sở dữ liệu PostgresQL
Hình 2.6 – Sơ đồ khối thuật toán tổng quan tối ưu hóa bản lưu (Trang 38)
Bảng sau thể hiện thời gian cập nhật 01 bản ghi với các thao tác insert, delete, update trên hai bảng được chọn để đo đạc là sales và countries  - Cập nhật gia tăng bất đồng bộ khung nhìn thực trong hệ quản trị cơ sở dữ liệu PostgresQL
Bảng sau thể hiện thời gian cập nhật 01 bản ghi với các thao tác insert, delete, update trên hai bảng được chọn để đo đạc là sales và countries (Trang 51)

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