Гость
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Методы оптимизации запросов / 18 сообщений из 18, страница 1 из 1
15.11.2018, 18:16
    #39733743
ukman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
Я решил написать статью о самых простых методах оптимизации SELECT запросов к реляционным БД из разряда:

Создать индекс на все foreign key поля, если количество записей в таблице будет превышать несколько тысяч

В статье я хочу сформировать check list для начинающих специалистов, что нужно сразу сделать или проверить, чтобы ускорить запрос.

Поделитесь своими рецептами, что вам помогает в большинстве простых случаев оптимизации.
...
Рейтинг: 0 / 0
15.11.2018, 18:23
    #39733746
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
ukman, то есть вы хотели, чтобы вам написали статью?
...
Рейтинг: 0 / 0
15.11.2018, 18:34
    #39733754
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
1. Стараться не делать представлений с вычислениями и группировками.
2. Не делать условий с вычислениями (а-ля X > Y+Z) и преобразованиями/конвертациями данных.
3. Избегать конструкций OR. Проверять область их действия. Иногда неверное указание скобок может "взорвать" запрос.
4. Если в запросе фигурируют пользовательские ф-ции - посмотреть на их код.
5. Избегать работу с NULL, т.к. оно не индексируется.
6. Если позволяет логика - для SELECT - запросов указывать with(nolock) для каждой таблицы.
7. Избегать запросов where ID in (select id from .....). Применяйте exists(select * from a where a.id = ВнешняяТаблица.id)
...
Рейтинг: 0 / 0
15.11.2018, 19:51
    #39733791
Alex_496
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
ukman,

Ицик Бен Ган, Федор Самородов, Сергей Олонцев и Дмитрий Коростылев и ряд других - у них написано т рассказано много премного.

Для OLTP и для DWH рекомендации разные.
Платформы тоже различия рекомендаций. Например, для MSSQL таблицам разумные индексы для аналитики помогут, а на Exadata для тех же обьемов таблиц индексы - что слону дробины
---
В плане исполнения запросов смотреть на вес логических чтений
...
Рейтинг: 0 / 0
15.11.2018, 21:32
    #39733807
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
>Создать индекс на все foreign key поля, если количество записей в таблице будет превышать несколько тысяч
Было у меня такое.
База позволяла использоватся множеством компаний и в каждой таблице был проставлен company_id ссылающимся на таблицу с единственной записью о нашей компании.
И в каждой таблице было по индексу на эту company_id.
Ведь вроде формально все правильно было сделано, но нулевой пункт был нарушен - используй мозги.
...
Рейтинг: 0 / 0
16.11.2018, 13:47
    #39734097
Cane Cat Fisher
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
L_argo6. Если позволяет логика - для SELECT - запросов указывать with(nolock) для каждой таблицы
Это надо сильно обосновать, что логика позволяет. NOLOCK - это ведь READ UNCOMMITED, вся изоляция транзакций коту под хвост.
...
Рейтинг: 0 / 0
16.11.2018, 15:00
    #39734167
ukman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
L_argo,

Спасибо за обстоятельный ответ

Прочитал про 3-ий пункт- действительно не знал, что OR такой "вредный"

7-ой пункт прочитал, пишут, что актуально для MSSQL и MySQL, пока не успел на них попробовать. Я больше по PostgreSQL, на нем попробовал несколько вариантов, запросов с id in (select...) и exists(select...), но тут даже планы запросов совпадают.

Интересно как это на Oracle...
...
Рейтинг: 0 / 0
16.11.2018, 15:03
    #39734171
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
Cane Cat FisherЭто надо сильно обосновать, что логика позволяет. NOLOCK - это ведь READ UNCOMMITED, вся изоляция транзакций коту под хвост.Да пофиг на эту изоляцию чуть менее, чем всегда. :)
...
Рейтинг: 0 / 0
16.11.2018, 15:05
    #39734174
ukman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
Cane Cat Fisher,

Да, согласен надо учитывать, но часто изоляция переоценена, если запрос строит OLAP запрос, где важны порядки цифр (процент затрат по бюджету проекта), то конкретное изменение на 0.01% из-за того, что какой-то значение попало из "неправильной" транзакции- не играет большой роли.
...
Рейтинг: 0 / 0
10.12.2018, 12:14
    #39745226
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
ukmanЯ решил написать статью о самых простых методах оптимизации SELECT запросов к реляционным БД из разряда:

Создать индекс на все foreign key поля, если количество записей в таблице будет превышать несколько тысяч

В статье я хочу сформировать check list для начинающих специалистов, что нужно сразу сделать или проверить, чтобы ускорить запрос.

Поделитесь своими рецептами, что вам помогает в большинстве простых случаев оптимизации.

Не забудь потом дать ссылку тут, что б я поржал...
...
Рейтинг: 0 / 0
10.12.2018, 12:24
    #39745234
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
Нну... не ... нельзя так оставлять...

автор1. Стараться не делать представлений с вычислениями и группировками.

Делать-то представления можно любые, главное -- не использовать их потом...


автор2. Не делать условий с вычислениями (а-ля X > Y+Z) и преобразованиями/конвертациями данных.

И почему бы это? А если пользователь заказал?


автор3. Избегать конструкций OR. Проверять область их действия. Иногда неверное указание скобок может "взорвать" запрос.

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


автор4. Если в запросе фигурируют пользовательские ф-ции - посмотреть на их код.

Удивительно полезный совет!
Кажется, единственный правильный.
Именно! надо вместо того, чтобы писать запрос, посмотреть код функций. И смотреть, и смотреть, и смотреть...
Главное -- запрос не писать! Ну или хотя бы не запускать (см. выше)

автор5. Избегать работу с NULL, т.к. оно не индексируется.

Ну, в разных СУБД по-разному, если в Оракл оно не индексируется, это ещё не повод...

автор6. Если позволяет логика - для SELECT - запросов указывать with(nolock) для каждой таблицы.

А если логика не позволяет, или её вообще нет -- лучше вообще запрос не писать.

автор7. Избегать запросов where ID in (select id from .....). Применяйте exists(select * from a where a.id = ВнешняяТаблица.id)

Вообще, хотел что-то конструктивное написать, но советы такие ... ну совсем ниже плинтуса... что только один сарказм остался.

На последок дам один единственный совет, зато правильный на 100%:

Код: plaintext
1.
2.
Не пытайтесь описать производительность запросов какими-то правилами, и не пытайтесь давать универсальные советы по написанию запросов.
Все такие правила не работают.
...
Рейтинг: 0 / 0
10.12.2018, 12:26
    #39745238
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
Cane Cat FisherL_argo6. Если позволяет логика - для SELECT - запросов указывать with(nolock) для каждой таблицы
Это надо сильно обосновать, что логика позволяет. NOLOCK - это ведь READ UNCOMMITED, вся изоляция транзакций коту под хвост.

Да главное, что к производительности запроса это никакого отношения не имеет вообще...
...
Рейтинг: 0 / 0
10.12.2018, 13:21
    #39745293
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
MasterZiv,

И к чему тут целая гора саркастических каментов без какой либо аргументации ?
Просто поумничать ?

И где советы по сабжу в Вашем исполнении ? Хоть один ?

Ан нет...... Парочка все же есть:
"Делать-то представления можно любые, главное -- не использовать их потом"
"И вообще лучше SQL не писать".
...
Рейтинг: 0 / 0
10.12.2018, 13:40
    #39745310
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
L_argoMasterZiv,

И к чему тут целая гора саркастических каментов без какой либо аргументации ?
Просто поумничать ?


Да, а что?

Ну и там в конце ещё есть совет. Главный.
...
Рейтинг: 0 / 0
10.12.2018, 16:58
    #39745488
Alex_496
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
по-возможности, избегать UNION и DISTINCT,

ORDER BY выполнять в клиентском приложении типа Excel и Win Forms
...
Рейтинг: 0 / 0
10.12.2018, 17:26
    #39745506
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
по-возможности, избегать UNIONНу.... тут неоднозначно.
Иногда сложный запрос проще разбить на два более простых с UNION.
Они будут более читабельны и планы у них могут быть оптимальнее.
Т.е. надо смотреть по ситуации.
...
Рейтинг: 0 / 0
10.12.2018, 19:18
    #39745576
Alex_496
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
L_argo,

по возмодности <> категорически
...
Рейтинг: 0 / 0
10.12.2018, 22:38
    #39745651
Megabyte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы оптимизации запросов
Alex_496ORDER BY выполнять в клиентском приложении типа Excel и Win Forms
Сейчас насоветуют...
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Методы оптимизации запросов / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]