@sendnikkei

Как уменьшить время обработки запроса?

Добрый времени уважаемые!
Подскажите пожалуйста, в чем может быть проблема и куда копать.
1. Есть таблица, на 400.000 строк
2. Есть такой запрос:
SELECT t.[id],t.[is_c],t.[mobile_p],t.[external_u],t.[spots],t.[state_id],t.[state_date],t.[max_state] 
FROM [c] AS t WITH (NOLOCK) 
WHERE t.external_uids.exist( 'external_uids/external_uid/uid[.=(.......) = 1 
ORDER BY [id] OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY


Есть требование: запрос должен отрабатываться за 20 секунд. При значении FETCH NEXT меньше 100 (99,98) запрос выполняется за 20 секунд. При значении от 100 - запрос обрабатывается от 1 минуты 40 секунд.
Индексы есть, с ними все ок. Другие запросы (например обычный SELECT * - выполняются за 10-15 секунд).
В чем может быть проблема?
  • Вопрос задан
  • 618 просмотров
Решения вопроса 1
bubandos
@bubandos
bash'у, javascript'ую, php'лю, css'аю, html'каю
меня мутят мутные сомнения, что проблема где-то здесь:
WHERE t.external_uids.exist( 'external_uids/external_uid/uid[.=(.......) = 1
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
ApeCoder
@ApeCoder
t.external_uids.exist( 'external_uids/external_uid/uid[.=(.......) = 1 похоже на xpath - вместо использования hash join bkили типа того происходит вероятно дорогой лукап по каждой записи. Надо переписать данные в обычную таблицу и использовать ее.

Приведите план запроса, пожалуйста.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
  • Посмотрите план выполнения.
  • Индекс на t.external_uids и на t.id есть?
  • Замените exist на in.
  • 400000 - не тот объем, чтоб MS SQL на нем приседал. Может быть у вас не хватает памяти для SQL сервера и/или диски медленные?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы