我可以使用索引来加速BaseX中dateTime范围内的选择查询吗?

时间:2016-03-16 14:07:16

标签: xquery basex

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

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

我正在使用以下代码检索事件,该代码根据时间戳节点的日期时间进行选择

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

但它很慢,它让一分钟返回60个事件。 BaseX数据库中有许多数据。 如何加快请求或我的数据库?

1 个答案:

答案 0 :(得分:2)

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的 Info View 中,您可以看到应用了文本索引:

  

<强>编译:

     
      
  • 重写后代或自我步骤
  •   
  • 为&#34;测量&#34;
  • 应用文本索引   
  • 预评估&#34; 2016-03-15T18:00:00.000&#34;施放为xs:dateTime
  •   
  • 预评估&#34; 2016-03-15T19:00:00.000&#34;施放为xs:dateTime
  •   
     

优化查询

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