Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Индексы и снижение производительности  [new]
Interloper
Member

Откуда: Москва
Сообщений: 542
В каких случаях форсированное применение индекса с помощью хинта может привести к снижению производительности всей БД?
23 мар 20, 11:12    [22104296]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и снижение производительности  [new]
msLex
Member

Откуда:
Сообщений: 7724
Interloper
В каких случаях форсированное применение индекса с помощью хинта может привести к снижению производительности всей БД?

Например, скан большого индекса, вместо поиска по ключу(index-seek).
23 мар 20, 11:15    [22104297]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и снижение производительности  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
В тех, когда он не подходит для конкретного запроса.
23 мар 20, 11:15    [22104298]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и снижение производительности  [new]
Interloper
Member

Откуда: Москва
Сообщений: 542
В моем случае есть SPA-приложение, на странице есть множество фильтров. Я заметил, что при определенном сочетании фильтров запрос медленно работает. Я сделал индекс по 3 полям, которые используются в фильтре. Сам запрос достаточно сложный из-за сортировки и пагинации, SQL Server почему-то не захотел автоматически подхватывать этот индекс - планировщик говорит, что лучше без него. Так как запрос все равно генерится динамически, я анализирую условия фильтрации и, если они подходят, форсирую индекс хинтом. И действительно, запрос по нужному фильтру стал выполняться быстро. Но, выкатив это дело на прод, увидели, что БД стала работать медленнее в целом, даже в тех запросах, которые не связаны с затронутой таблицей. Пытаюсь понять, как так вышло и как точно установить, что виновата данная оптимизация.
23 мар 20, 11:22    [22104302]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и снижение производительности  [new]
AlexBra
Member

Откуда:
Сообщений: 65
Interloper,

>> даже в тех запросах, которые не связаны с затронутой таблицей
значит не ней проблема
23 мар 20, 11:26    [22104308]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и снижение производительности  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4365
Interloper
В моем случае есть SPA-приложение, на странице есть множество фильтров. Я заметил, что при определенном сочетании фильтров запрос медленно работает. Я сделал индекс по 3 полям, которые используются в фильтре. Сам запрос достаточно сложный из-за сортировки и пагинации, SQL Server почему-то не захотел автоматически подхватывать этот индекс - планировщик говорит, что лучше без него. Так как запрос все равно генерится динамически, я анализирую условия фильтрации и, если они подходят, форсирую индекс хинтом. И действительно, запрос по нужному фильтру стал выполняться быстро. Но, выкатив это дело на прод, увидели, что БД стала работать медленнее в целом, даже в тех запросах, которые не связаны с затронутой таблицей. Пытаюсь понять, как так вышло и как точно установить, что виновата данная оптимизация.


Ситуация вполне стандартная и распространенная.

Есть большая таблица или даже комплекс таблиц и надо организовать поисковую систему. Со временем это обрастает кучей индексов и вы получаете "форсированное применение индекса с помощью хинта может привести к снижению производительности всей БД".

Делаются попытки подкрутить все это, ибо перерабатывать лень, дорого, бизнес не понимает зачем, "итак все работало" и т.д.

Решения такие
1) Подготовить структуру данных специально ориентированную на поиск, где данные уложены в другом виде и позволяют быстро получать то, что надо. Например, таблицы предварительной сортировки или фильтрации.
2) Вместо конгломерата индексов использовать колумнстор (не всегда, но во многих случаях помогает)
3) Воспользоваться специализированным поисковым движком, типа Elasticsearch (или кто-то может посоветовать что-то другое)
4) Применить кеширование поисковых результатов

Сообщение было отредактировано: 23 мар 20, 12:14
23 мар 20, 12:12    [22104375]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и снижение производительности  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
Interloper,

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

Если же эта таблица используется и как витрина и как средство хранения данных одновременно, то функциональность можно разделить - данные для обработки отдельно, витрина отдельно. Организовать сбор витрины, настроить индексы, для витрины их может быть много, а рабочие таблицы максимально облегчить от индексов.
23 мар 20, 15:02    [22104524]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и снижение производительности  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30701
Interloper
В каких случаях форсированное применение индекса с помощью хинта может привести к снижению производительности всей БД?
В случае, если на тесте стало быстрее - значит, получился план, который делает запрос более быстрым, но потребляющим больше ресурсов.

Или быстрее стало работать на том наборе данных, с которым тестировали, но этот набор оказался неполным, не отражающим запросы на проде.
Interloper
как точно установить, что виновата данная оптимизация.
Ну, нужно смотреть модель данных, разные варианты планов, с хинтом и без.

Ещё можно попереключать туда-сюда - а то, может, вы ещё что то поменяли, люди иногда при отладке меняют что то пачками, а потом додумывают, какое из изменений привело к результату.
23 мар 20, 19:11    [22104746]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и снижение производительности  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
Interloper
Но, выкатив это дело на прод, увидели, что БД стала работать медленнее в целом, даже в тех запросах, которые не связаны с затронутой таблицей.

Столкнулся с такой же ситуацией.
Теперь на тесте и проде у меня разные индексы на разных таблицах.
Просто принял как данность.
24 мар 20, 10:57    [22104955]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и снижение производительности  [new]
uaggster
Member

Откуда:
Сообщений: 757
alexeyvg
Interloper
В каких случаях форсированное применение индекса с помощью хинта может привести к снижению производительности всей БД?
В случае, если на тесте стало быстрее - значит, получился план, который делает запрос более быстрым, но потребляющим больше ресурсов.

Или быстрее стало работать на том наборе данных, с которым тестировали, но этот набор оказался неполным, не отражающим запросы на проде.

Или прода и тест настроены по-разному. MSSQLSERVER, я имею ввиду.
Например, может очень сильно влиять разница в collations. Фатально, я б сказал.
25 мар 20, 12:54    [22105648]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и снижение производительности  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
uaggster,

автор
Или прода и тест настроены по-разному.


В этом случае тест ничего не тестирует и смысла в нём нет никакого. Чисто размяться.
25 мар 20, 17:15    [22105822]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить