Подсчет (*) в столбце NText очень, очень, очень медленный. Почему это так медленно? И как я могу улучшить производительность? - PullRequest
2 голосов
/ 12 января 2011

У меня проблемы с базой данных SQL Server 2005. У меня есть таблица со строками заказа, и у каждой строки есть поле NTEXT с именем XmlData. Я хочу подсчитать все поля, в которых нет информации. Я использую этот запрос:

SELECT Count(*) FROM [OrderLine] WITH(NOLOCK) 
WHERE [XmlData] NOT LIKE '' AND [XmlData] IS NOT NULL 

В таблице 230,314 записей, и этот запрос подсчета занимает несколько минут. Кто-нибудь из вас, ребята, знает, как повысить производительность?

Примечание: я не могу изменить тип столбца на nvarchar(max) тип. НОЛОК был советом коллеги.

Я с нетерпением жду некоторых советов и объяснений.

Ответы [ 3 ]

4 голосов
/ 12 января 2011

Чтобы избежать дорогостоящих операций чтения больших объектов, замените [XmlData] NOT LIKE '' на DATALENGTH([XmlData])>0 - DATALENGTH не нужно считывать значение LOB каждой строки.как предлагали другие: по возможности используйте nvarchar (max) вместо ntext.

2 голосов
/ 12 января 2011

NTEXT устарел, вместо этого используйте nvarchar (max) (рассмотрите xml ...).

Если вы измените тип столбца, вы можете создать индекс для столбца, таким образом, создание статистики для столбца поможет SQL выбрать лучший способ использования этого индекса.

Создание статистики для XMLDataстолбец, так как это создает карту значений, которая значительно увеличит количество запросов типа.

CREATE STATISTICS STATOrderLineXmlData
ON OrderLine (XmlData)
WITH FULLSCAN

На основе ответа @ Pent вы должны изменить свой запрос на этот: Замените запрос на это:

SELECT Count(*) 
FROM [OrderLine] WITH(NOLOCK) 
WHERE [XmlData] IS NOT NULL 
AND DATALENGTH([XmlData]) > 0

Проверьте эту ссылку , если вы изменяете тип столбца для nvarchar (max).Ссылка содержит информацию о небольшом хитром обновлении, которое вам нужно сделать, чтобы повысить производительность после изменения столбца.

1 голос
/ 12 января 2011

Прежде всего, этот запрос будет включать сканирование таблицы. Это будет медленно с 230К строк. Вы можете попробовать заменить NOT LIKE на Length (XmlData) = 0, но я не думаю, что это сильно поможет. С другой стороны, я не уверен, что функция Length работает с типами данных NText. Я не думаю, что это так, теперь, когда я думаю об этом.

Суть в том, что сканирование таблицы происходит медленно, а работа с типами данных NText идет медленно. Так что у вас плохая комбинация здесь. Я не вижу здесь много возможностей для улучшения, если только тип данных не может быть изменен.

И я уверен, что вы, вероятно, понимаете, что использование WITH NOLOCK рискует прочитать грязные данные? Да, это может помочь производительности, но это не бесплатно. Возможно, вы читаете незафиксированные изменения.

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