BaseX Xquery优化

时间:2017-09-26 07:14:34

标签: xml xquery basex

您好我在C ++中使用BaseX并且我的查询性能有问题。我有一个带有manny Xml文件的数据库,但是有一个xml文件是从一个看起来像这样的csv文件导入的。

<record>
  <hsn>0005</hsn>
  <tsn>486</tsn>
  <factorycode>BMW 3/1</factorycode>
  <description>318I</description>
  <power>83</power>
  <cubiccapacity>1796</cubiccapacity>
  <typeapprovaldate>19910701</typeapprovaldate>
  <xxx>1</xxx>
  <mid>BMW00737</mid>
</record>

我有一个简单的Query语句,它使用相同的hsn和tsn

查找每个mid
for $mid in doc('database')//record
where $mid / hsn = '0005' and $mid / tsn = '404'
return $mid/mid

问题是它需要很长时间,因为xml文件包含许多记录。

有没有办法优化我的查询或xml文件? 我认为属性索引可以工作,但我不知道如何在我的数据库http://docs.basex.org/wiki/Indexes

中使用它

1 个答案:

答案 0 :(得分:0)

首先,你是什么意思&#34;长期&#34;你保留了多少条记录?太长可能意味着多秒或几分钟,或者它可能意味着50毫秒,因为它对于您的用例来说太长了。提问时请更具体。

接下来,您肯定不会使用属性索引,因为您在xml中没有任何属性。您想使用文本索引。通常,优化器应该重写您的查询以在这种情况下使用文本索引,但是您可以确保查看&#34;查询信息&#34;在BaseX GUI中查看。在编译步骤和生成的优化查询中,您应该看到使用索引的条目。如果您没有看到任何内容,则不会使用索引,因为由于某种原因,优化程序决定不会或者您的索引不是最新的。您可以直接使用db:text

但是,让我给你两个不相关的提示:首先,如果表现是一个问题,你永远不会使用//。它是一个后代或自我的步骤,这意味着BaseX必须查看所有后代元素。相反,请使用特定路径,即doc('database')/records/record

另外,不要写$mid / hsn。虽然它可能是有效的,但在路径运算符之间放置空格是非常不寻常的。而只是删除空格并写下$mid/hsn