【发布时间】:2014-01-07 13:42:55
【问题描述】:
我正在使用 Oracle 数据库。我有一个表,其中一个列是 XMLTYPE。现在,问题陈述是我需要提取那些具有带有特定根元素和一个条件的 XML 的记录的计数。假设存储的 XML 格式如下:
<ns1:Warehouse whNo="102" xmlns:ns1="xyz">
<ns1:Building></ns1:Building>
</ns1:Warehouse>
和
<ns1:Warehouse whNo="102" xmlns:ns1="xyz">
<ns1:Building>Owned</ns1:Building>
</ns1:Warehouse>
除了 Warehouse 之外,还有其他带有 Root 元素的 XML
现在,我需要获取那些有
- 作为仓库的根元素
- 建筑元素为空
我编写了以下 SQL 查询:
select count(XMLQuery('declare namespace ns1="xyz.com";
for $i in /*
where fn:local-name($i) eq "Warehouse"
and fn:string-length($i/ns1:Building ) = 0
return <Test>{$i/ns1:Building}</Test>'
PASSING xml_response RETURNING CONTENT)) countOfWareHouses
from test
这里,test是表的名字,*xml_response*是test表中XMLTYPE列的名字。
当记录较少时,此查询可以正常工作。我已经对表中大约 500 条记录进行了测试,所需时间约为 0.1 秒。但是随着表中记录数的增加,时间也会增加。当我将记录数增加到 5000 条时,所用时间约为 11 秒。对于当前存储的记录数为 185000 的生产表,此查询永远不会完成。
请帮助我优化此查询或 xquery。
编辑 1:
我试过用这个:
select count(XMLQuery(
'declare namespace ns1 = "xyz";
for $i in /
return /ns1:Warehouse[not(ns1:Building/text())]'
PASSING xml_response RETURNING CONTENT))
from test
和
select count(XMLQuery(
'declare namespace ns1 = "xyz";
return /ns1:Warehouse[fn:string-length(ns1:Building)=0]'
PASSING xml_response RETURNING CONTENT))
from test
但这不起作用。
当我尝试运行这些时,它会要求为 Building 和 Warehouse 提供绑定值。
【问题讨论】:
-
您的 xquery 看起来太复杂了。我敢打赌,可以计算 xquery 中的空元素。这个answer 似乎解决了您的问题,但它正在计算非空元素。希望对您有所帮助!
标签: sql performance plsql xquery xquery-sql