xml, nodes speed

Mnior
Дата: 09.06.2011 09:56:47
Не знаю даже куда постить. И надеюсь не баян.

Имеется xml размером 50-100 метров примерно следующей структуры:
/Root/<Table>/Data/Row, где <Table> название объекта.
нод /Root/<Table> имеется под 20-40 штук, а самих /Root/<Table>/Data/Row под сотню-другую тысяч. Так вот есть два эквивалентных запроса:
SELECT M.X.value('@ID','Int') FROM @XML.nodes('/Root/MyTable/Data/Row')M(X)
SELECT R.X.value('@ID','Int') FROM @XML.nodes('/Root/MyTable/Data')M(X) CROSS APPLY M.X.nodes('Row')R(X)
Первое отрабатывает за минут 20, в второе за секунд 20. Стабильно, и на похожих случаях.
/Root/MyTable/Data - порядка 10 элементов, а всего всех этих Row меньше 100 тысяч.

Что-то какой-то "слегка" неоптимальный этот XQuery.
Регить как багу? Или может быть так стало после последних оптимизаций?
forestGreen
Дата: 21.06.2011 21:00:27
Столкнулся с похожей (на мой взгляд) проблемой. Необходимо импортировать данные из документа размером в ~15 Мб.

Структура документа - Workbook/Worksheet/Table/Row/Cell

Workbook/Worksheet/Table - 1 запись
Row - ~4 тыс. записей
Cell - ~20-30 узлов на строку

Запрос возвращает 86 строк за 5 секунд
select distinct T.r.query('.').value('(/Row/Cell)[1]', 'varchar(200)') n
from @xml.nodes('/Workbook/Worksheet/Table/Row') T(r)

попытка вставить результаты этого запроса во временную таблицу - 9 минут!

declare @t table(n varchar(200))
insert into @t(n)
select distinct T.r.query('.').value('(/Row/Cell)[1]', 'varchar(200)') n
from @xml.nodes('/Workbook/Worksheet/Table/Row') T(r)
Посоветовали сравнить актуальные планы запросов.
В итоге выяснилось, что проблема в том, что в плане есть Table Spool (Eager Spool) с актуальным числом записей ~ 1 млрд.!!!

Переписал запрос на следующий:

declare @t table(n varchar(200))
insert into @t(n)
select distinct T.r.value('(./Cell[1])[1]', 'varchar(200)') n
from @xml.nodes('/Workbook/Worksheet/Table/Row') T(r)
Выполнилось за 5 секунд, как и требовалось.

Есть какие-нибудь соображения почему оптимизатор в одном случае добавляет спул, а в другом нет?
Подскажите что почитать на тему XQuery и планов запросов, чтобы как-то лучше понимать происходящее и быть готовым к чудесам
daw
Дата: 21.06.2011 21:26:05
> попытка вставить результаты этого запроса во временную таблицу - 9 минут!

2008-ой?
forestGreen
Дата: 21.06.2011 21:31:13
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) Apr 22 2011 19:23:43 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )
daw
Дата: 21.06.2011 21:36:03
если _перед началом батча_ выставить dbcc traceon(4130) - не лечится?
http://support.microsoft.com/kb/957205

хотя, если переписывание помогло, мож и не оно. но похоже по описанию.
forestGreen
Дата: 21.06.2011 21:50:48
не помогло
данные выдаваться стали раньше (начиная где-то со 2-й минуты)
время выполнения 8:45
daw
Дата: 21.06.2011 21:59:45
forestGreen
не помогло
данные выдаваться стали раньше (начиная где-то со 2-й минуты)
время выполнения 8:45


как это - выдаваться? проблема же со вставкой была, или я не понял чего?
ну, нет - так нет. не оно, значит.
forestGreen
Дата: 21.06.2011 23:40:16
Проблема была в Table Spool'е, которые генерил 1 млрд. записей перед вставкой в таблицу, что увеличило время выборки данных с 5 секунд до 9 минут.
Мне бы хотелось понять, почему возник этот table spool и как его можно избежать и предвидеть.
forestGreen
Дата: 22.06.2011 09:36:14
daw
как это - выдаваться? проблема же со вставкой была, или я не понял чего?

Это я что-то вчера заработался. В тестовом запросе стоял select и за ним insert+select. select выдал данные, а затем 8 с лишним минут работал insert. В общем установка флага не помогла, или если и помогла, то всего лишь уменьшим время вставки на 20-30 секунд.
daw
Дата: 22.06.2011 09:45:20

> В общем установка флага не помогла, или если и помогла, то всего лишь уменьшим время
> вставки на 20-30 секунд.

а точно _до_ начала батча его ставите? он на его компиляцию влияет, потому что.

dbcc traceon
GO
-- тут инсерт идет

так? пардон за настырность, но уж больно похожи симптомы - вот то же появление тейбл спула как раз.

Posted via ActualForum NNTP Server 1.4