Trong bài viết này, chúng ta sẽ khám phá cách tận dụng XMLTABLE
để thay thế hàm EXTRACTVALUE
đã lỗi thời trong Oracle. Việc chuyển đổi này không chỉ tuân theo khuyến nghị của Oracle mà còn mang lại hiệu suất truy vấn đáng kể, đặc biệt khi làm việc với dữ liệu XML trong các ứng dụng như enterprise geodatabase (cơ sở dữ liệu địa lý doanh nghiệp). Hãy cùng tìm hiểu lý do tại sao XMLTABLE
là lựa chọn tốt hơn và cách triển khai nó trong các truy vấn SQL của bạn.
Hàm EXTRACTVALUE
, mặc dù quen thuộc với nhiều người dùng Oracle, đã bị đánh dấu là không nên sử dụng (deprecated) từ phiên bản 11g R2. Oracle khuyến cáo sử dụng XMLTABLE
, XMLCAST
hoặc XMLQUERY
thay thế. Lý do chính là:
EXTRACTVALUE
không còn được hỗ trợ phát triển và có thể bị loại bỏ trong các phiên bản Oracle tương lai.XMLTABLE
mang lại hiệu suất tốt hơn đáng kể, đặc biệt với các truy vấn phức tạp.XMLTABLE
cung cấp khả năng linh hoạt hơn trong việc xử lý và trích xuất dữ liệu từ tài liệu XML.
Việc chuyển đổi sang XMLTABLE
là một bước quan trọng để đảm bảo tính ổn định và hiệu quả của các ứng dụng sử dụng cơ sở dữ liệu Oracle của bạn.
Một trong những lợi ích lớn nhất của XMLTABLE
là hiệu năng vượt trội so với EXTRACTVALUE
. Dưới đây là một ví dụ so sánh thực tế:
Giả sử chúng ta cần trích xuất mã (code) và mô tả (description) từ các miền giá trị được mã hóa (coded value domains) trong bảng sde.gdb_items_vw
của một enterprise geodatabase. Sử dụng EXTRACTVALUE
, truy vấn có thể như sau:
SELECT
extractvalue(codedvalues.column_value, 'CodedValue/Code') AS domain_code,
extractvalue(codedvalues.column_value, 'CodedValue/Name') AS domain_description
FROM
sde.gdb_items_vw items
CROSS JOIN
xmlsequence(xmltype(definition).extract('/GPCodedValueDomain2/CodedValues/CodedValue')) codedvalues
WHERE
items.name IS NOT NULL;
Trong khi đó, sử dụng XMLTABLE
, truy vấn tương tự có thể được viết lại như sau:
SELECT
i.name AS domain_name,
x.code,
x.description
FROM
sde.gdb_items_vw i
CROSS APPLY
xmltable(
'/GPCodedValueDomain2/CodedValues/CodedValue'
PASSING xmltype(i.definition)
COLUMNS
code VARCHAR2(255) PATH './Code',
description VARCHAR2(255) PATH './Name'
) x
WHERE
i.name IS NOT NULL;
Trong một thử nghiệm thực tế, truy vấn sử dụng XMLTABLE
đã nhanh hơn gấp đôi so với truy vấn sử dụng EXTRACTVALUE
(5 giây so với 10 giây). Trong một số trường hợp khác, hiệu suất có thể cải thiện đến 4.5 lần. Điều này đặc biệt quan trọng khi làm việc với lượng lớn dữ liệu XML trong các hệ thống enterprise geodatabase.
Quá trình chuyển đổi từ EXTRACTVALUE
sang XMLTABLE
có thể được thực hiện theo các bước sau:
EXTRACTVALUE
.EXTRACTVALUE
bằng cấu trúc XMLTABLE
.PASSING
để truyền dữ liệu XML vào XMLTABLE
.COLUMNS
để định nghĩa các cột và đường dẫn (PATH) đến các phần tử XML cần trích xuất.
Ví dụ, giả sử bạn có một bảng po_table
chứa dữ liệu XML về đơn đặt hàng. Bạn có thể trích xuất số đơn hàng (PO_Num) và nhà cung cấp (PO_Vendor) như sau:
SELECT
xt.po_num,
xt.vendor
FROM
po_table p_t,
XMLTable(
XMLNamespaces(default 'http://tempuri.org/'),
'/PurchaseOrder'
PASSING p_t.po_xml_data
COLUMNS
po_num VARCHAR2(12) PATH 'PO_Num/text()',
vendor VARCHAR2(12) PATH 'PO_Vendor/text()'
) xt
WHERE
p_t.po_xml_data_id = '366000000008143';
Việc chuyển từ EXTRACTVALUE
sang XMLTABLE
là một bước quan trọng để tối ưu hóa hiệu năng truy vấn XML trong Oracle, đặc biệt trong các ứng dụng sử dụng enterprise geodatabase. Bằng cách tuân theo các hướng dẫn trên và áp dụng XMLTABLE
vào các truy vấn của bạn, bạn có thể cải thiện đáng kể tốc độ và hiệu quả của việc xử lý dữ liệu XML. Đừng quên kiểm tra và điều chỉnh các truy vấn của bạn để đạt được hiệu suất tối ưu.
Bài viết liên quan