Оптимизация проекции XQuery
Я получаю ужасную производительность от проекции XQuery на Sql Server. Каким будет лучший способ написать следующее преобразование?
select DocumentData.query( '<object type="dynamic"> <state> <OrderTotal type="decimal"> {fn:sum( for $A in /object[1]/state[1]/OrderDetails[1]/object/state[1] return ($A/ItemPrice[1] * $A/Quantity[1]))} </OrderTotal> <CustomerId type="guid"> {xs:string(/object[1]/state[1]/CustomerId[1])} </CustomerId> <Details type="collection"> {/object[1]/state[1]/OrderDetails[1]/object} </Details> </state> </object>') as DocumentData from documents
(Я знаю, что код немного из контекста)
Если я проверил выполнение плана для этого кода, произойдет примерно 10+ объединений. Должен ли я сломать это, чтобы использовать для $ var для каждого уровня в структуре?
- Удаление десериализации объекта XML в T-SQL
- xquery заменяет значение, если узел существует
- операция изменения в столбце XML занимает слишком много времени
- Выберите данные строки в дополнение к структурированным данным XML
- Для Xquery требуется singleton: имя столбца является атрибутом
Для большего контекста это то, что я пытаюсь выполнить: http://rogeralsing.com/2011/03/02/linq-to-sqlxml-projections/
Я пишу «переводчик Linq to XQuery» / эмулятор базы данных NoSQL Document, фильтрация работает как шарм, прогнозы страдают от проблем.
- SQL Server 2012 создает список VARBINARY в одном XML-элементе
- Является ли это хорошим способом хранения данных XML в SQL Server 2008?
- Как получить определенное пространство имен XML в XQuery в SQL Server
- MSSQL 2012: удалить атрибут XML с помощью переменной
- Выберите все узлы, кроме одного в XML, используя XQuery
- Я запрашиваю схему, которая идентична во 2 файлах xml, за исключением самого высокого уровня
- Вложенные элементы XML XML
- SQL-сервер Объедините два xmls в третий
Эта статья весьма полезна: оптимизация производительности для типа данных XML в SQL Server 2005
В частности, он рекомендует вместо написания путей формы …
/ Объекта [1] / состояние [1] / CustomerId [1]
вам стоит написать …
(/ Объект / состояние / CustomerId) [1]