BaseX Xquery优化


春风助手
2025-03-07 05:36:25 (22天前)

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



  1. 0005
    486
    BMW 3/1
    318I
    83
    1796
    19910701
    1
    BMW00737

我有一个简单的查询语句,查找具有相同hsn和tsn的每个中间内容


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

2 条回复
  1. 1# 只怕再见是故人 | 2020-08-25 10-29

    首先,“ to long”是什么意思,您保留多少记录?太长可能意味着几秒钟或几分钟,或者可能意味着50ms,因为对于您的用例而言太长了。问问题时请更具体。

    接下来,您肯定不会使用属性索引,因为好吧,您的xml中没有任何属性。您要使用Text索引。通常,在这种情况下,您的查询应由优化器重写以使用文本索引,但是您可以确保仅查看BaseX GUI中的“查询信息”视图。在编译步骤和产生的优化查询中,您应该看到使用索引的条目。如果您什么都没有看到,则不使用索引,因为出于某种原因,优化器决定不这样做,或者您的索引不是最新的。您可以直接使用db:text。http://docs.basex.org/wiki/Database_Module#db:text

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

    此外,请勿编写$mid / hsn。尽管这可能是有效的,但在路径运算符之间放置空格是非常不常规的。相反,只需删除空白并写入即可$mid/hsn。

登录 后才能参与评论