2016-03-16 4 views
0

Я хотел бы спросить о том, как ускорить выбор запросов в базе Basex. У меня есть, например, следующий XML в базе данных с большим количеством событий (650000 приблизительно)Могу ли я использовать индексы для ускорения выбора запросов по диапазонам дат в BaseX?

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

Я извлекая события с помощью следующего кода, который выбирает по отношению к DateTime узла 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 

Но он очень медленный, он возвращает одну минуту, чтобы вернуть 60 событий. В базе данных BaseX имеется много данных. Как ускорить запрос или мою базу данных?

+0

Если вы правильно отложите XML и добавите некоторые разумные штрихи к вашему коду XQuery перед публикацией, шансы сильно увеличатся, кто-то прочитает ваш код. Кроме того, «многие» не являются разумной количественной оценкой, дают количество документов и узлов вместо этого, чтобы предоставить некоторые аргументированные числа, то же самое относится к «медленным». Наконец, почему вы обычно пишете заголовки все в нижнем регистре, а в правиле вопроса? –

ответ

2

Basex в настоящее время не имеет индекс диапазона для xs:dateTime, но вы можете использовать текстовый индекс для получения всех событий с данным событием Type путем перемещения сравнения в XPath:

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 

В Info Просмотр графического интерфейса вы можете увидеть, что индекс текста применяется:

Компиляция:

  • переписывания потомка или автопортрет шага (ы)
  • подача текст индекса для "Измерения"
  • предварительно оценивая "2016-03-15T18: 00: 00.000" брошена как хз: DateTime
  • предварительной оценки "2016-03-15T19: 00: 00,000" брошено как хз: 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 
+0

Я проверил первый запрос, и он идет быстрее. Я не понял объяснения. почему он идет быстрее? Где находится информационный просмотр графического интерфейса? Sory Я немного смущен. Другой вопрос: если оптимизированный запрос будет быстрее, чем ваш первый запрос и почему. Заранее благодарен – vagelis

+0

Я также получил «неверное имя базы данных» с оптимизированным запросом – vagelis

+0

Ваш первоначальный запрос просматривает все узлы 'Event' в базе данных и проверяет, удовлетворяют ли они трем условиям. Если существует современный текстовый индекс *, это может быть улучшено путем (1) поиска всех текстовых узлов в базе данных, содержащих строку «Измерение», а затем (2) вверх в иерархии документов, чтобы найти связанные 'Event's. Переформулировав запрос так, как я это сделал, я помог оптимизатору найти вторую стратегию. Вы также можете использовать [db: text (...)] (http://docs.basex.org/wiki/Database_Module#db:text), если хотите. Информационный просмотр можно переключить, нажав 'Strg + I'. –