|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
Я решил написать статью о самых простых методах оптимизации SELECT запросов к реляционным БД из разряда: Создать индекс на все foreign key поля, если количество записей в таблице будет превышать несколько тысяч В статье я хочу сформировать check list для начинающих специалистов, что нужно сразу сделать или проверить, чтобы ускорить запрос. Поделитесь своими рецептами, что вам помогает в большинстве простых случаев оптимизации. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 18:16 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
ukman, то есть вы хотели, чтобы вам написали статью? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 18:23 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
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) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 18:34 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
ukman, Ицик Бен Ган, Федор Самородов, Сергей Олонцев и Дмитрий Коростылев и ряд других - у них написано т рассказано много премного. Для OLTP и для DWH рекомендации разные. Платформы тоже различия рекомендаций. Например, для MSSQL таблицам разумные индексы для аналитики помогут, а на Exadata для тех же обьемов таблиц индексы - что слону дробины --- В плане исполнения запросов смотреть на вес логических чтений ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 19:51 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
>Создать индекс на все foreign key поля, если количество записей в таблице будет превышать несколько тысяч Было у меня такое. База позволяла использоватся множеством компаний и в каждой таблице был проставлен company_id ссылающимся на таблицу с единственной записью о нашей компании. И в каждой таблице было по индексу на эту company_id. Ведь вроде формально все правильно было сделано, но нулевой пункт был нарушен - используй мозги. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 21:32 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
L_argo6. Если позволяет логика - для SELECT - запросов указывать with(nolock) для каждой таблицы Это надо сильно обосновать, что логика позволяет. NOLOCK - это ведь READ UNCOMMITED, вся изоляция транзакций коту под хвост. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2018, 13:47 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
L_argo, Спасибо за обстоятельный ответ Прочитал про 3-ий пункт- действительно не знал, что OR такой "вредный" 7-ой пункт прочитал, пишут, что актуально для MSSQL и MySQL, пока не успел на них попробовать. Я больше по PostgreSQL, на нем попробовал несколько вариантов, запросов с id in (select...) и exists(select...), но тут даже планы запросов совпадают. Интересно как это на Oracle... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2018, 15:00 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
Cane Cat FisherЭто надо сильно обосновать, что логика позволяет. NOLOCK - это ведь READ UNCOMMITED, вся изоляция транзакций коту под хвост.Да пофиг на эту изоляцию чуть менее, чем всегда. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2018, 15:03 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
Cane Cat Fisher, Да, согласен надо учитывать, но часто изоляция переоценена, если запрос строит OLAP запрос, где важны порядки цифр (процент затрат по бюджету проекта), то конкретное изменение на 0.01% из-за того, что какой-то значение попало из "неправильной" транзакции- не играет большой роли. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2018, 15:05 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
ukmanЯ решил написать статью о самых простых методах оптимизации SELECT запросов к реляционным БД из разряда: Создать индекс на все foreign key поля, если количество записей в таблице будет превышать несколько тысяч В статье я хочу сформировать check list для начинающих специалистов, что нужно сразу сделать или проверить, чтобы ускорить запрос. Поделитесь своими рецептами, что вам помогает в большинстве простых случаев оптимизации. Не забудь потом дать ссылку тут, что б я поржал... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2018, 12:14 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
Нну... не ... нельзя так оставлять... автор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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2018, 12:24 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
Cane Cat FisherL_argo6. Если позволяет логика - для SELECT - запросов указывать with(nolock) для каждой таблицы Это надо сильно обосновать, что логика позволяет. NOLOCK - это ведь READ UNCOMMITED, вся изоляция транзакций коту под хвост. Да главное, что к производительности запроса это никакого отношения не имеет вообще... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2018, 12:26 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
MasterZiv, И к чему тут целая гора саркастических каментов без какой либо аргументации ? Просто поумничать ? И где советы по сабжу в Вашем исполнении ? Хоть один ? Ан нет...... Парочка все же есть: "Делать-то представления можно любые, главное -- не использовать их потом" "И вообще лучше SQL не писать". ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2018, 13:21 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
L_argoMasterZiv, И к чему тут целая гора саркастических каментов без какой либо аргументации ? Просто поумничать ? Да, а что? Ну и там в конце ещё есть совет. Главный. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2018, 13:40 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
по-возможности, избегать UNION и DISTINCT, ORDER BY выполнять в клиентском приложении типа Excel и Win Forms ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2018, 16:58 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
по-возможности, избегать UNIONНу.... тут неоднозначно. Иногда сложный запрос проще разбить на два более простых с UNION. Они будут более читабельны и планы у них могут быть оптимальнее. Т.е. надо смотреть по ситуации. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2018, 17:26 |
|
Методы оптимизации запросов
|
|||
---|---|---|---|
#18+
L_argo, по возмодности <> категорически ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2018, 19:18 |
|
|
start [/forum/topic.php?fid=32&msg=39734171&tid=1539980]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 236ms |
total: | 363ms |
0 / 0 |