Оптимизация проекции XQuery - PullRequest
2 голосов
/ 02 марта 2011

Я получаю ужасную производительность от проекции 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 для каждого уровня в структуре?

Для большего контекста, это то, что я пытаюсь сделать:"Linq to XQuery переводчик" / эмулятор NoSQL Document DB, фильтрация работает как чудо, проекции страдают от проблем с перфорированием.

1 Ответ

2 голосов
/ 02 марта 2011

Эта статья весьма полезна: Оптимизация производительности для типа данных XML в SQL Server 2005

В частности, рекомендуется вместо записи путей формы ...

/ object [1] / state [1] / CustomerId [1]

вместо этого следует написать ...

(/ object / state / CustomerId) [1]

...