Tìm kiếm hiệu quả không phân biệt dạng chữ với pureXML DB2
Tìm kiếm và sắp xếp dữ liệu XML theo cách không phân biệt dạng chữ
Matthias Nicola, Chuyên gia v hiệu năng CSDL, IBM Silicon Valley Laboratory
Tóm tắt: Các giá trị của các phần tử và các thuộc tính XML, theo định nghĩa, là
phân biệt dạng chữ. Ví dụ, nếu bạn tìm kiếm các phần tử <city> cho giá trị "Paris",
bạn sẽ không tìm thấy "PARIS" hoặc "paris". Điều này có thể được giải quyết
bằng các hàm XQuery như fn:upper-case(), nhưng hiệu năng sẽ không phải luôn
luôn tối ưu do việc sử dụng các m như vậy cản trở việc sử dụng các chỉ số
XML. Bài viết này giải thích cách tạo ra một cơ sở dữ liệu không phân biệt dạng
chữ khi sử dụng DB2® pureXML và hành vi hay xảy ra trong truy vấn XML và
các chỉ mục XML
Mục lục
Case-insensitive search with upper/lower case functions
Creating a case-insensitive database in DB2
Query XML data in a case-insensitive database
Performance
Summary
Tìm kiếm không phân biệt dạng chvới các hàm chhoa và chữ thường
Ví dsau sẽ cho bạn một sự hiểu biết rõ ràng hơn về tìm kiếm không phân biệt
dạng chữ. Liệt kê 1 định nghĩa một bảng có một cột số nguyên (INTEGER) và một
cột XML và chèn 7 hàng vào trong bảng đó. Mỗi hàng có chứa một tài liệu khách
hàng nhỏ có chứa một phần tử XML <city>.
Các giá trị trong phần tử này khác nhau về chữ hoa và chữ thường. Một số giá trị
tất cả là chữ hoa, một sgiá trị tất cả là chthường và một số trường hợp trộn lẫn
("ký tự chữ hoa đầu tiên"). Điều này có th xảy ra khi dữ liệu này đã đến từ một
loạt các ứng dụng có sử dụng các quy tắc khác nhau để nhập vào dữ liệu chữ hoa
và chữ thường.
Liệt kê 1. Bảng và dữ liệu mu
CREATE TABLE customer (id INTEGER, xmldoc XML);
INSERT INTO customer (id, xmldoc) VALUES
(1,'<Customer id="1"><city>PARIS</city></Customer>'),
(2,'<Customer id="2"><city>Tokyo</city></Customer>'),
(3,'<Customer id="3"><city>tokyo</city></Customer>'),
(4,'<Customer id="4"><city>PARIS</city></Customer>'),
(5,'<Customer id="5"><city>paris</city></Customer>'),
(6,'<Customer id="6"><city>Delhi</city></Customer>'),
(7,'<Customer id="7"><city>Paris</city></Customer>');
Một ứng dụng truy vấn các tài liệu XML này để tìm kiếm các khách hàng với một
thành phcụ thể hầu như đòi hỏi tìm kiếm không phân biệt dạng chữ. Ví dụ, bạn
có thmuốn tìm tất cả các khách hàng Paris và hy vọng sẽ lấy ra hàng 1, 4, 5 và
7. Tuy nhiên, nếu bạn tìm kiếm giá trị "Paris", thì chcó hàng 7 được trả về. Đ
tóm lấy tất cả bốn hàng mà bạn cần, bạn có thể sử dụng hàm XQuery fn:upper-
case() để biến đổi các giá trị phần tử thành phố thành dạng chữ hoa và so sánh
chúng với ""PARIS". Điều này được chỉ ra trong truy vấn trong Liệt kê 2 nó trả về
tất cả bốn khách hàng Paris.
Liệt kê 2. Chọn các khách hàng Paris
SELECT id, XMLCAST( XMLQUERY('$XMLDOC/Customer/city') AS
VARCHAR(15)) AS city
FROM customer
WHERE XMLEXISTS('$XMLDOC/Customer[fn:upper-case(city) =
"PARIS"]');
Nếu truy vấn của bạn sử dụng một dấu tham số cho giá trị tìm kiếm, rồi tham số
này cũng sẽ được biến đổi sang dạng chữ hoa. Điều này được thể hiện trong Liệt
kê 3. Dấu tham số ("?") được gõ vào là VARCHAR(15) và được chuyển vào vị từ
XQuery như là biến "c".
Liệt kê 3. Chọn các khách hàng khi sử dụng một dấu tham số
SELECT id, XMLCAST( XMLQUERY('$XMLDOC/Customer/city') AS
VARCHAR(15)) AS city
FROM customer
WHERE XMLEXISTS('$XMLDOC/Customer[fn:upper-case(city) = fn:upper-
case($c)]'
PASSING CAST(? AS VARCHAR(15)) AS "c");
Hình 1 cho thấy kết quả đầu ra của các truy vấn thí dụ ở trên.
Hình 1. Kết quả của truy vấn thí dụ
Tất cả điều này thực hiện tốt nếu bạn đang truy vấn chỉ một số lượng nhỏ dữ liệu
hoặc nếu các truy vấn của bạn cũng chứa các vị từ chọn như là vị từ dạng chữ hoa
được áp dụng chỉ cho một tập kết quả trung gian nhỏ. Vấn đề là vị từ có hàm
fn:upper-case() ngăn cản sử dụng các chỉ mục XML trong DB2. Do đó, cách tiếp
cận này không thích hợp với số lượng lớn dữ liệu.
Để tránh việc sử dụng hàm fn:upper-case() và lợi dụng các lợi ích của các chỉ mục
XML, cần thiết tạo ra một cơ sở dữ liệu không phân biệt dạng chữ.
Tạo một cơ sở dữ liệu không phân biệt dạng chữ trong DB2
DB2 htrợ phép đối chiếu Unicode nhận biết-cục bộ kể từ Phiên bản 9.5 Bản sửa
lỗi 1. Điều này cho phép bạn bỏ qua dạng chữ và/hoc các dấu. Để tạo một cơ sở
dữ liệu không phân biệt dạng chữ cho tất cả các phép so sánh chuỗi, cần thiết sử
dụng đối chiếu UCA500R1 như trong Liệt kê 4.
Liệt kê 4. Tạo một cơ sở dữ liệu không phân biệt dạng chữ