我可以使用索引来加速 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
我想问一下在 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