我想问一下加速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数据库中有许多数据。 如何加快请求或我的数据库?
答案 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