Я выполняю запрос, который обрабатывает некоторые узлы из документа XML. Моя приблизительная стоимость поддерева исчисляется миллионами, и кажется, что все это происходит из-за операции сортировки, которую sql-сервер выполняет над некоторыми данными, которые я извлекаю из столбцов xml через XPath. Операция Sort имеет приблизительное число строк, равное приблизительно 19 миллионам, тогда как фактическое количество строк составляет около 800. Сам запрос выполняется достаточно хорошо (1 - 2 секунды), но расхождение заставляет меня задуматься о производительности запроса и почему разница такая большая?
sql-server
query-performance
xml
Питер Смит
источник
источник
Ответы:
Статистика по столбцам XML не генерируется. Оценки предполагаются на основе выражений, используемых при запросе XML.
Используя эту таблицу:
И этот довольно простой XML-запрос:
Даст вам одну возвращаемую строку, но оценочные возвращенные строки будут равны 200. Это будет 200 независимо от того, какой XML или сколько XML вы вставляете в столбец XML для этой одной строки.
Это план запроса с отображаемым предполагаемым количеством строк.
Чтобы улучшить или хотя бы изменить оценки, можно предоставить оптимизатору запросов дополнительную информацию о XML. В этом случае, поскольку я знаю, что это
root
действительно корневой узел в XML, я могу переписать запрос следующим образом.Это даст мне оценку 5 возвращенных строк.
Переписывание запроса, вероятно, не ускорит уничтожение XML, но если оценки будут лучше, есть вероятность, что оптимизатор запросов может принимать более разумные решения для остальной части запроса.
Я не нашел никакой документации о правилах оценки, кроме презентации Майкла Риса, где он говорит:
источник