【问题标题】:BaseX Xquery optimizationBaseX Xquery 优化
【发布时间】:2023-03-18 18:07:01
【问题描述】:

您好,我在 C++ 中使用 BaseX,但我的查询性能存在问题。我有一个包含许多 Xml 文件的数据库,但例如有一个从 csv 文件导入的 xml 文件,看起来像这样。

<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>

我有一个简单的查询语句,它用相同的 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

【问题讨论】:

  • 您是否按照您引用的 Wiki 文章中的说明检查了 Info View 的输出?

标签: xml xquery basex


【解决方案1】:

首先,您所说的“to long”是什么意思?您保留了多少条记录?太长可能意味着数秒或数分钟,也可能意味着 50 毫秒,因为它对于您的用例来说太长了。提问时请更具体。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多