通过xmltype了解解释计划

时间:2015-04-28 14:22:36

标签: oracle xpath xmltype sql-execution-plan

我在这样的查询中遇到了错误的xpath(' @'缺少属性谓词)导致的性能问题:

从表中选择extractvalue(字段,' // item [attr =" value"]'),其中field1 =:1;

我期待一个异常,但似乎Oracle接受这个特殊的xpath, 有意义吗?

我尝试针对该查询执行解释计划,但结果很奇怪,有人可以帮我理解吗?

我使用此代码重现环境

$response->getRoles()

在第一个解释中,有一个'嵌套循环' (第2行)基数667K在第二个消失了。 在同一个表格中插入更多记录并执行新的解释平面(没有' @')该值始终为667K。

它代表什么价值?

1 个答案:

答案 0 :(得分:1)

  

我期待一个异常,但似乎Oracle接受这个特殊的xpath,有意义吗?

嗯,是的。 xpath /root/g[key="G"]本身取出了一个节点,该节点的子节点带有#34; key"和价值" G"。因此,即使extractvalue失败(返回多个节点),这也可以:

select extract(xmltype('<root>
<a key="A">Aaa</a>
<g key="G"><key>G</key>Ggg</g>
<h key="H">Hhh</h></root>'),'/root/g[key="G"]').getStringVal() from dual;

返回<g key="G"><key>G</key>Ggg</g>

在这种搜索中,高成本可能是合理的,因为属性可能比其他类型的子节点更加优化和可搜索(可以说每个标签只能有一个具有特定名称的属性,标签可以重复多次)。