XQuery, где проверьте производительность с помощью SQL Query

У меня есть одна таблица sql со столбцом xml, которая содержит значение, как показано ниже xml

<Security xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Dacl>
    <ACEInformation>
      <UserName>Authenticated Users</UserName>
      <Access>Allow</Access>
      <IsInherited>false</IsInherited>
      <ApplyTo>This object only</ApplyTo>
      <Permission>List Contents</Permission>
      <Permission>Read All Properties</Permission>
      <Permission>Read Permissions</Permission>
    </ACEInformation>
    <ACEInformation>
      <UserName>Administrator</UserName>
      <Access>Allow</Access>
      <IsInherited>false</IsInherited>
      <ApplyTo>This object only</ApplyTo>
      <Permission>Read All Properties</Permission>
      <Permission>Delete</Permission>
    </ACEInformation>
    <ACEInformation>
      <UserName>Admin2</UserName>
      <Access>Allow</Access>
      <IsInherited>false</IsInherited>
      <ApplyTo>This object only</ApplyTo>
      <Permission>Read All Properties</Permission>
      <Permission>Delete</Permission>
    </ACEInformation>
  </Dacl>
</Security>

Здесь мне нужно, я должен запросить все значения UserName, которые имеют значения Доступ: Разрешить и Разрешение: Удалить. Для этого я использую следующий XQuery.

Select xmlColumn.query('for $item in (/Security/Dacl/ACEInformation[Access="Allow"][Permission="Delete"]/UserName) return concat($item,";")').value('.','NVARCHAR(MAX)') from myTable

Он возвращает значение: Администратор;Администратор2 для приведенного выше xml. запрос работает нормально... но производительность очень низкая, для 1000 строк требуется 1 минута.

Можете ли вы предоставить лучший xquery для этого случая?


person kombsh    schedule 25.11.2013    source источник


Ответы (2)


Никаких реальных изменений в xQuery, но я заменил concat на for xml concat.

select (
       select A.X.value('(UserName/text())[1]', 'nvarchar(max)')+';'
       from T.xmlColumn.nodes('/Security/Dacl/ACEInformation[Access = "Allow" and Permission = "Delete"]') as A(X)
       for xml path(''), type
       ).value('text()[1]', 'nvarchar(max)')
from myTable as T
person Mikael Eriksson    schedule 25.11.2013
comment
Спасибо, Микаэль. Это работает хорошо, и проблема с производительностью заключается в том, что мой PBM не находится в запросе. - person kombsh; 25.11.2013
comment
Привет, Микаэль, у меня есть еще один вопрос, ты можешь мне помочь? пожалуйста, проверьте запись этого вопроса ---> stackoverflow.com/questions/20188220/ - person kombsh; 25.11.2013

Я не думаю, что проблема в XQuery, вы можете немного изменить его ([Access="Allow"][Permission="Delete"] => [Access="Allow" and Permission="Delete"]).

На 1000 строк ваш запрос работает довольно быстро на скрипте SQL - см. демонстрацию скрипта sql

person Roman Pekar    schedule 25.11.2013