Вчера на работе в основном занимался тестированием сайта через различные прокси и оптимизацией запросов. Перед самым новым годом работы нет, поэтому подчищаем сайт.
Один из запросов выполнялся 20 и более минут, хотя на все поля, по которым происходит поиск индексы есть. Даже не смотря на то, что одна из таблиц оооооччччень громадная, запрос не должен работать так долго. Это просто нереально.
Запрос искал транзакции для людей по определенной дате. Причем дату искали следующим спомобом:
select что-то здесь from куча связей между 5 таблицами where dateadd(day, 30, ПолеДаты) = GetDate()
Запрос должен найти транзакции, совершенные людьми, зарегестрированными тридцать дней назад. Даже не смотря на то, что ПолеДаты содержит индекс, этот индекс не будет использоваться SQL сервер, потому что на этом поле стоит математика. Если поле как-то изменяется в запросе и используется в расчетах, то можете попрощатся с эффективностью.
Оптимизатор SQL сервер достаточно умный, но он не станет думать за вас, что математика тут нафиг не нужна.
select что-то здесь from куча связей между 5 таблицами where ПолеДаты = dateadd(day, -30, GetDate())
Вот теперь математики нет и SQL сервер будет использовать индекс. После этого минимального изменения запрос стал выполнятся 1 секунду.
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым
Михаил, я так понимаю, вы сейчас в основном занимаетесь базами данных для Web. В перспективе не собираетесь написать книгу по созданию клиент-серверных приложений на C#? как, к примеру, книга Андрея Шкрыль Создание Клиент-серверных приложений на Delphi
Ничего не планирую
супер!
Михаил, Вы — Хакер! (в правильном смысле этого слова)
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.