【发布时间】:2012-03-04 22:47:05
【问题描述】:
我有一个大型 xml 数据库(30 000 个文件,1.3 Go)。此数据库中的一个文件列出了数据库中存在的所有其他文件。我的目标是“简单地”检查列出的所有文件是否都存在于数据库中。但是我必须不关心文件的名称,而只关心文档中的 XML 代码。
是这样的:
declare variable $root := fn:collection();
declare function local:isValid($fileCode) {
let $fileSearchedIdentCode := $root/dmodule/identity/dmCode
return
$fileCode/@attribute1 = $fileSearchedIdentCode/@attribute1 and
$fileCode/@attribute2 = $fileSearchedIdentCode/@attribute2 and
$fileCode/@attribute3 = $fileSearchedIdentCode/@attribute3
};
<result>
{
for $fileCode in $root/file[identity/@fileType eq 'listOfFiles']/fileContent/fileEntry/fileCode
return
if (local:isValid($fileCode))
then <filePresent>1</filePresent>
else <fileNonPresent>2</fileNonPresent>
}
</result>
上面的代码是为一个小型数据库运行的,但对我来说,它需要大量的时间。
所以,我想知道是否有人可以帮助我改进该代码以便在合理的时间内执行它;)
(我的数据库已编入索引)
感谢您的帮助!!
约翰
【问题讨论】:
-
我无法编辑我的帖子 :( 抱歉没有说“你好”
-
打招呼不是惯例。你能告诉你使用哪个数据库吗?使用索引可能需要使用专有扩展,或者优化您的表达式以匹配内置优化。 30k 文档不算多,但足够想用索引了。
-
我必须在几个数据库(baseX、marklogic、oracle db XML 和 qizx)上创建一个基准。目前我正在使用 BaseX。
-
优化查询通常涉及给定数据库的细节,所以我不确定这是一个特别好的问题。也就是说,我希望每个数据库都有不同的答案。您列出的所有数据库都不是一个答案。
标签: oracle11g query-optimization xquery marklogic