SQL Server 2008 XML производительность столбца Проблема - PullRequest
1 голос
/ 06 сентября 2011

У нас есть таблица со столбцом XML, содержащая довольно много данных, это отлично работало в наших средах разработки, но с ростом размера таблицы (около 10000 строк) мы стали сталкиваться с проблемами производительности.

Просто SELECT * занимает 12 секунд в одиночку ...

Любые предложения, чтобы исправить это?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 06 сентября 2011

Вы можете проверить несколько вещей - по крайней мере, если снижение производительности происходит в основном при работе с данными и выборе данных из столбца XML:

  • вы можете поставить индекс наваш XML-столбец - это может помочь, если вам нужно получить много данных из столбца XML.Одно слово предостережения: XML-индексы используют много дискового пространства - в нашем случае база данных объемом 1,5 ГБ взлетела до 11 ГБ на диске ... используйте с осторожностью!

  • вы можете «выложить» определенные элементы из вашего XML на «родительскую» таблицу как вычисленные постоянные столбцы и, таким образом, быстрее найти нужные вам строки (нужна сохраненная функция - но это действительно довольно хороший методесли вам это нужно)

Также: никогда не делайте SELECT * в любом случае - а если вам не нужен столбец XML - не выбирайте его - он будет довольно многословными использовать совсем немного памяти.

0 голосов
/ 03 октября 2012

Если вы запрашиваете записи и фильтруете данные в типе данных XML, вы просите SQL Server проверить все содержимое XML, чтобы найти результаты.

Чтобы ускорить процесс, объедините фильтры типов данных XML сполнотекстовый поиск выражений.Полнотекстовый поиск сужает результаты (в зависимости от того, насколько вы конкретны), прежде чем анализировать и искать XML.Это может сэкономить много ресурсов процессора и ввода-вывода.Вот пример:

SELECT * 
FROM   Table 
WHERE  CONTAINS(XmlColumn,'value') 
AND    XmlColumn.exist('/element/element/text()[contains(.,"value")]') = 1

Это задокументировано Microsoft здесь , и вы можете проверить свои «до» и «после», выполнив свои запросы со статистикой.Вот как вы включаете статистику:

SET STATISTICS IO ON;
SET STATISTICS TIME ON;
0 голосов
/ 07 сентября 2011

Просто добавлю немного к тому, что сказал marc_s: я бы также порекомендовал индекс - 10 тыс. Записей не очень много. Но убедитесь, что вы добавляете индекс для правильной вещи - обычно лучшие места для размещения индексов - это столбцы, которые используются для условий JOIN, предложений WHERE или ORDER BY. Если ваш запрос не использует сам XML для этих случаев, вам лучше будет создать индекс для другого столбца (например, если вы выполняете поиск по идентификатору, который находится в столбце, отличном от XML, вы можете увидеть больше пользы от создания индекса по идентификатору).

Если на самом деле извлечение данных XML происходит медленно, вы можете рассмотреть возможность создания покрывающего индекса (с использованием ключевого слова INCLUDE), где у вас есть индекс для идентификатора, но ВКЛЮЧЕНО выражение, которое извлекает значение из столбца XML. Это имело огромное значение для меня в одном из моих проектов, но, как всегда, обязательно проверь производительность.

Конечно, если ваши запросы действительно выполняют JOIN / WHERE / ORDER BY для данных XML, то вам, вероятно, следует сделать то, что рекомендует marc_s, и создать индекс для столбца XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...