[英]BaseX Xquery optimization
您好,我在C ++中使用BaseX,但查询性能存在问题。 我有一个包含Manny 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查找每个中间
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
首先,“ to long”是什么意思,您保留多少记录? 太长可能意味着数秒或数分钟,或者可能意味着50ms,因为对于您的用例而言太长了。 问问题时请更具体。
接下来,您肯定将永远不会使用属性索引,因为好吧,您的xml中没有任何属性。 您要使用Text索引 。 通常,在这种情况下,您的查询应由优化程序重写以使用文本索引,但是您可以确保仅查看BaseX GUI中的“查询信息”视图。 在编译步骤和产生的优化查询中,您应该看到使用索引的条目。 如果您什么都看不到,则不使用索引,因为出于某种原因,优化器决定不这样做,或者您的索引不是最新的。 您可以直接使用db:text 。
但是,让我给您两个不相关的提示:首先,如果您担心性能,请不要使用//
。 这是一个后代或自身步骤,这意味着BaseX必须查看所有后代元素。 而是使用特定路径,即doc('database')/records/record
。
另外,不要写$mid / hsn
。 尽管这可能是有效的,但在路径运算符之间放置空格是非常不常规的。 相反,只需删除空格并写入$mid/hsn
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.