我可以使用索引来加速 BaseX 中日期时间范围内的 select 查询吗?

Can I use indexes for speeding up select queries over dateTime ranges in BaseX?

我想问一下在 Basex 数据库中加速 select 查询的方法。 例如,我在包含许多事件(大约 650000)的数据库中有以下 xml

<EventList>
    <Event>
        <ID>317849</ID>
        <Type>Measurement</Type>
        <TimeStamp>2016-03-15T18:00:09.409</TimeStamp>
        <Space>BIOCAT</Space>
        <SourceID>BIOCAT.TE310A</SourceID>
        <Content>
            <Measurement>
                <value>920</value>
            </Measurement>
        </Content>
    </Event>
    <Event>
        <ID>317850</ID>
        <Type>Measurement</Type>
        <TimeStamp>2016-03-15T18:05:09.409</TimeStamp>
        <Space>BIOCAT</Space>
        <SourceID>BIOCAT.TE310A</SourceID>
        <Content>
            <Measurement>
                <value>920</value>
            </Measurement>
        </Content>
    </Event>
</EventList>

我正在使用以下代码检索事件 selects 相对于 Timestamp 节点的日期时间

for $b in doc('mydb/my.xml')//EventList/Event
let $date_string as xs:string := xs:string($b/TimeStamp/data())
let $date as xs:dateTime := xs:dateTime($date_string)  
where $date ge xs:dateTime('"+startdate+"')
  and $date le xs:dateTime('"+enddate+"') 
  and $b/Type='"+EventType+"'
return $b

但是它非常慢,它需要一分钟才能完成 return 60 个事件。 BaseX数据库中有很多数据。 我怎样才能加快请求或我的数据库?

BaseX 当前没有 xs:dateTime 的范围索引,但您可以使用文本索引通过将比较移动到 XPath 来获取具有给定事件 Type 的所有事件:

for $b in //EventList/Event[Type = 'Measurement']
let $date as xs:dateTime := xs:dateTime($b/TimeStamp)
where $date ge xs:dateTime('2016-03-15T18:00:00.000')
  and $date le xs:dateTime('2016-03-15T19:00:00.000')
return $b

在 GUI 的信息视图中,您可以看到应用了文本索引:

Compiling:

  • rewriting descendant-or-self step(s)
  • applying text index for "Measurement"
  • pre-evaluating "2016-03-15T18:00:00.000" cast as xs:dateTime
  • pre-evaluating "2016-03-15T19:00:00.000" cast as xs:dateTime

Optimized Query:

for $b_0 in db:text("mydb/my.xml", "Measurement")
        /parent::*:Type/parent::*:Event[parent::*:EventList]
let $date_1 as xs:dateTime := $b_0/TimeStamp cast as xs:dateTime?
where (($date_1 ge "2016-03-15T18:00:00")
  and ($date_1 le "2016-03-15T19:00:00"))
return $b_0