Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как ускорить выполнение XPath запроса  [new]
mdabicycle
Member

Откуда:
Сообщений: 47
Добрый день. Есть у меня ХМЛ


<lemmata>
<lemma id="1" rev="1"><l t="ёж"><g v="NOUN"/><g v="anim"/><g v="masc"/></l><f t="ёж"><g v="sing"/><g v="nomn"/></f><f t="ежа"><g v="sing"/><g v="gent"/></f><f t="ежу"><g v="sing"/><g v="datv"/></f><f t="ежа"><g v="sing"/><g v="accs"/></f><f t="ежом"><g v="sing"/><g v="ablt"/></f><f t="еже"><g v="sing"/><g v="loct"/></f><f t="ежи"><g v="plur"/><g v="nomn"/></f><f t="ежей"><g v="plur"/><g v="gent"/></f><f t="ежам"><g v="plur"/><g v="datv"/></f><f t="ежей"><g v="plur"/><g v="accs"/></f><f t="ежами"><g v="plur"/><g v="ablt"/></f><f t="ежах"><g v="plur"/><g v="loct"/></f></lemma>
<lemma id="2" rev="2"><l t="ёж"><g v="NOUN"/><g v="inan"/><g v="masc"/></l><f t="ёж"><g v="sing"/><g v="nomn"/></f><f t="ежа"><g v="sing"/><g v="gent"/></f><f t="ежу"><g v="sing"/><g v="datv"/></f><f t="ёж"><g v="sing"/><g v="accs"/></f><f t="ежом"><g v="sing"/><g v="ablt"/></f><f t="еже"><g v="sing"/><g v="loct"/></f><f t="ежи"><g v="plur"/><g v="nomn"/></f><f t="ежей"><g v="plur"/><g v="gent"/></f><f t="ежам"><g v="plur"/><g v="datv"/></f><f t="ежи"><g v="plur"/><g v="accs"/></f><f t="ежами"><g v="plur"/><g v="ablt"/></f><f t="ежах"><g v="plur"/><g v="loct"/></f></lemma>
</lemmata>

И вот делаю запрос вида


  select  T2.Loc.value('@v', 'varchar(1024)') as Param
    from  @x.nodes('//lemmata/lemma/l/g') as T2(Loc) 



Он работает около 2 минут. Меня это в полне устраивает. А вот такой запрос

  select T2.Loc.value('../../@id', 'bigint') as ID,  T2.Loc.value('@v', 'varchar(1024)') as Param
    from  @x.nodes('//lemmata/lemma/l/g') as T2(Loc) 


В течении 20 минут я не дождался результата и остановил. Скажите как мне такое написать чтобы возвращалось за приемлемое время?
24 окт 12, 10:16    [13366820]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение XPath запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Оба запроса отработали меньше секунды
Что-то вы не договариваете
24 окт 12, 10:20    [13366861]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение XPath запроса  [new]
mdabicycle
Member

Откуда:
Сообщений: 47
Я представил кусок XML чтобы структуру данных было видно. На самом деле у меня размер XML окого 500 МБ и там 300 тыс тегов lemma
24 окт 12, 10:30    [13366916]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение XPath запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
mdabicycle
На самом деле у меня размер XML окого 500 МБ и там 300 тыс тегов lemma

Вам уже советовали средство для парсинга файлов такого размера.
24 окт 12, 10:31    [13366926]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение XPath запроса  [new]
mdabicycle
Member

Откуда:
Сообщений: 47
Так я в БД уже загрузил эти данные. Теперь вот гоняю данные, и все остальные запросы работают за приемлемое время
24 окт 12, 10:34    [13366938]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение XPath запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
mdabicycle
Так я в БД уже загрузил эти данные.

Вы не данные загрузили, а сам файл.
24 окт 12, 10:36    [13366954]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение XPath запроса  [new]
mdabicycle
Member

Откуда:
Сообщений: 47
Я в БД загрузил в столбец типа XML весь файл, теперь раскидываю по структуру таблиц в БД
24 окт 12, 10:38    [13366966]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение XPath запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
mdabicycle
Я в БД загрузил в столбец типа XML весь файл, теперь раскидываю по структуру таблиц в БД

Ну так и получили то, что получили
24 окт 12, 10:39    [13366975]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение XPath запроса  [new]
mdabicycle
Member

Откуда:
Сообщений: 47
Ну у меня не простое отображение на таблицы, там куча проверок и подстановка идентификаторов. Вообщем счас пробую вот так

declare @AllParams table
(
  ID bigint,
  Params xml
)

insert @AllParams
select  T2.Loc.value('@id', 'bigint') as ID ,  T2.Loc.query('l/g') as Param
  from  @x.nodes('//lemmata/lemma') as T2(Loc) 


Этот запрос у меня работает не более 2 минут. Счас буду тестить остальные части

П.С. Спасибо за советы
24 окт 12, 11:06    [13367137]     Ответить | Цитировать Сообщить модератору
 Re: Как ускорить выполнение XPath запроса  [new]
VAlexey
Member

Откуда:
Сообщений: 130
Для больших xml в xpath лучше не использовать ссылки на элементы выше по иерархии ( пути с "../" )
Лучше переписать запрос на что-то типа такого:
select  T2.Loc.value('@id', 'bigint') as ID ,  T3.x.value('@v' 'varchar(1024)') as Param
from  @x.nodes('//lemmata/lemma') as T2(Loc) 
   cross apply T2.Loc.nodes('l/g') T3(x)
24 окт 12, 13:15    [13368153]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить