我有两个查询同样的解释简单:
1) select * from cfm_t_dmp;
2) SELECT CATEGORY_ID,
STATUS,
USERNAME,
VALID_FROM,
EXTRACTVALUE (
XMLType (data_definition),
'/customer/type/permissions/text()'),
EXTRACTVALUE (
XMLType (data_definition),
'/bundle/configuration/permissions/text()'),
AB_LOCK
FROM cfm_t_dmp
查询1)执行得非常快,查询2)我在分钟处理后没有看到结果。
主要区别在于extractvalue,我之前执行了查询2)并且它很快。
我可以以任何方式调整2)查询,或者这是数据库问题吗?
谢谢,
答案 0 :(得分:1)
您的第二个查询速度较慢,因为Oracle必须在这些XPath上搜索您的XML类型。如果您有大量数据,或者XML内容很大,那么这将是一项额外的工作,并且会降低查询速度。
要加快速度:如果XPath不会更改,并且XML数据不会更改,您可以添加一个包含EXTRACTVALUE
表达式结果的额外列。查询该数据会更快,因为您的查询不需要调用EXTRACTVALUE
(因为它只会读取新列中的数据),但这需要您在插入或更新时预先填充它。
显然有可能在Oracle中对XML数据建立索引,虽然我自己从未尝试过这样做:http://docs.oracle.com/cd/B28359_01/appdev.111/b28369/xdb_indexing.htm虽然因为你没有测试值那些xpaths的条件,我不确定是否索引在这里会有所帮助。