Порядок выполнения операторов SQL
Казалось бы достаточно легкий вопрос, но многие люди сыпятся на нем когда необходимо дать ответ, причина заключается либо в незнании, либо в забывчивости.
Есть 2 варианта как запомнить:
1ый, который я всегда рекомендую - понять его логическую суть. Для закрепления материала хватит обьяснить данный порядок своими словами кому-то из друзей. Ведь лучший способ понять - попробовать обьяснить другому
2ой, банальный до безумия - зазубрить перед собесом.
Составить себе квиз карточки или визуально запомнить порядок.
1. FROM — сначала выбираем таблицу, с которой будем работать.
2. WHERE — фильтруем данные, оставляем только нужные строки.
3. GROUP BY — группируем данные, если это нужно.
4. HAVING — фильтруем уже сгруппированные данные.
5. SELECT — выбираем, какие столбцы нам нужны для вывода.
6. ORDER BY — сортируем результат.
7. LIMIT — ограничиваем количество строк в результате.
Лайфхак: представьте, что SQL — это построение дома.
- Сначала выбираем основу (FROM)
- убираем лишние (WHERE)
- группируем их по функциональности (GROUP BY)
- проверяем качество (HAVING)
- выбираем, какие комнаты показать (SELECT)
- сортируем по важности (ORDER BY)
- показываем только лучшие (LIMIT).
Вопрос на засыпку: Где будет JOIN, ведь я о нем умолчал?
(Сначала думаем сами, потом сверяемся, открывая спойлер)
Ответ:Между FROM и WHERE, так как это источники данных.
В аналогии с построением дома JOIN это добавляем необходимых материалов
Казалось бы достаточно легкий вопрос, но многие люди сыпятся на нем когда необходимо дать ответ, причина заключается либо в незнании, либо в забывчивости.
Есть 2 варианта как запомнить:
1ый, который я всегда рекомендую - понять его логическую суть. Для закрепления материала хватит обьяснить данный порядок своими словами кому-то из друзей. Ведь лучший способ понять - попробовать обьяснить другому
2ой, банальный до безумия - зазубрить перед собесом.
Составить себе квиз карточки или визуально запомнить порядок.
1. FROM — сначала выбираем таблицу, с которой будем работать.
2. WHERE — фильтруем данные, оставляем только нужные строки.
3. GROUP BY — группируем данные, если это нужно.
4. HAVING — фильтруем уже сгруппированные данные.
5. SELECT — выбираем, какие столбцы нам нужны для вывода.
6. ORDER BY — сортируем результат.
7. LIMIT — ограничиваем количество строк в результате.
Лайфхак: представьте, что SQL — это построение дома.
- Сначала выбираем основу (FROM)
- убираем лишние (WHERE)
- группируем их по функциональности (GROUP BY)
- проверяем качество (HAVING)
- выбираем, какие комнаты показать (SELECT)
- сортируем по важности (ORDER BY)
- показываем только лучшие (LIMIT).
Вопрос на засыпку: Где будет JOIN, ведь я о нем умолчал?
(Сначала думаем сами, потом сверяемся, открывая спойлер)
Ответ:
❤27🔥9🫡3
Нормальные формы
Сегодня разберем, что такое НФ-ки в бд и как они помогают улучшить структуру таблиц.
Нормализация — это процесс упрощения структуры данных, чтобы устранить избыточность и минимизировать ошибки.
Чаще всего в практических приложениях используются до 3NF или BCNF. Это объясняется рядом причин:
1NF:
• Используется всегда, как базовый стандарт.
• Все данные должны быть атомарными.
• На практике 1NF чаще всего соблюдается по умолчанию.
2NF:
• Применяется, когда таблица имеет составные ключи.
• На практике встречается в системах, где есть сложные связи, например:
Расписание (курс, аудитория, преподаватель).
Заказы (номер заказа, товар, количество).
3NF:
• Самая популярная форма в реальных базах данных.
• Устраняет транзитивные зависимости и считается золотым стандартом в реляционном проектировании.
• Используется в большинстве OLTP-систем (оперативных бд), где важны целостность данных и минимизация избыточности.
BCNF (Форма Бойса-Кодда):
Применяется реже, чем 3NF, но встречается в системах с более сложными зависимостями между атрибутами.
4NF и 5NF:
Используются в специфических случаях:
• При работе с многозначными зависимостями.
• Для устранения зависимостей объединения в больших проектах, где требуется высокое разделение данных.
• Обычно применяются в научных базах данных или хранилищах.
6NF:
• Практически не встречается в классических базах данных.
• Используется в временных базах данных (temporal databases), где важно отслеживать изменения данных с течением времени.
Почему 3NF используется чаще всего?
Она достигает баланса между:
• Устранением избыточности.
• Удобством использования данных.
• Простотой исполнения SQL-запросов.
После 3NF нормализация (например, до BCNF или 4NF) может привести к излишнему разбиению таблиц, что усложнит работу и увеличит количество JOIN-запросов.
Сегодня разберем, что такое НФ-ки в бд и как они помогают улучшить структуру таблиц.
Нормализация — это процесс упрощения структуры данных, чтобы устранить избыточность и минимизировать ошибки.
Чаще всего в практических приложениях используются до 3NF или BCNF. Это объясняется рядом причин:
1NF:
• Используется всегда, как базовый стандарт.
• Все данные должны быть атомарными.
• На практике 1NF чаще всего соблюдается по умолчанию.
2NF:
• Применяется, когда таблица имеет составные ключи.
• На практике встречается в системах, где есть сложные связи, например:
Расписание (курс, аудитория, преподаватель).
Заказы (номер заказа, товар, количество).
3NF:
• Самая популярная форма в реальных базах данных.
• Устраняет транзитивные зависимости и считается золотым стандартом в реляционном проектировании.
• Используется в большинстве OLTP-систем (оперативных бд), где важны целостность данных и минимизация избыточности.
BCNF (Форма Бойса-Кодда):
Применяется реже, чем 3NF, но встречается в системах с более сложными зависимостями между атрибутами.
4NF и 5NF:
Используются в специфических случаях:
• При работе с многозначными зависимостями.
• Для устранения зависимостей объединения в больших проектах, где требуется высокое разделение данных.
• Обычно применяются в научных базах данных или хранилищах.
6NF:
• Практически не встречается в классических базах данных.
• Используется в временных базах данных (temporal databases), где важно отслеживать изменения данных с течением времени.
Почему 3NF используется чаще всего?
Она достигает баланса между:
• Устранением избыточности.
• Удобством использования данных.
• Простотой исполнения SQL-запросов.
После 3NF нормализация (например, до BCNF или 4NF) может привести к излишнему разбиению таблиц, что усложнит работу и увеличит количество JOIN-запросов.
🔥20
Общение на "ты"
Ооой, очень такой интересный топик для меня.
Я часто слышу разные мнения на этот счет. Но скажу сразу, что я сторонник общения на "ты", но с некоторыми важными поинтами.
Поехали.
1. Это помогает легче влиться в коллектив и дает важное ощущение комфорта. Тебе не надо думать с кем поздороваться "привет", а с кем только "здравствуйте". Хотя в "привет" нет ничего такого от слова вообще, это не показатель неуважения))
2. Сразу скажу, что я рос в очень воспитанной семье и всегда говорил "здравствуйте". Без зумерских приколов, которые сейчас обсуждаются, что они и с учителями/преподователями на "ты" и пытаются быть своими в доску с первых секунд. Это неправильно, достаточно быть просто воспитанным, остальное придет.
3. "Я тебе друг что-ли, что ты так обращаешься".
Вот это лютый пиздец по-моему мнению. Такие люди в основном с синдромом вахтера и короной на голове. В первую очередь они не в ладах с собой, раз им необходимо чувствовать власть и доминацию над кем-то.
Я общался с юнит хэдами в Озоне и МТС-е, и с большинством - мне было легко. Очень здорово видеть в собеседнике умного человека, который не пытается тебя задушить. Напротив, общаясь на одном уровне ты только и думаешь: блин, вот [ он | она ] крут [ой | ая]. К таким людям кайф тянуться, а если они лидят тебя - так вообще супер, когда перед тобой такой лидер!
4. Как осторожничать, если не знаешь возможную реакцию?
4.1. Я искренне люблю слово "приветствую", нравится оно мне, золотая середина между привет и здравствуйте.
4.2. Начать со "Здравствуйте", посмотреть на вайб и по интуиции проявить инициативу: "не против если будем на ты?"
5. "А вот если коллектив разного возраста?"
А вот Маринке с соседнего отдела N лет, че мне ее на "ты" называть?
Блин, я ничего не вижу плохого в том, чтобы проявить инициативу, если оба потенциально расположены к этому. На крайний случай всегда можно откатиться назад. А порой проявленная инициатива служит улучшением коммуникаций в коллективе и разрушению барьеров.
Может Маринке кайф быть с вами на одной волне и не чувствовать себя "старше".
Еще что добавил бы в особенные случаи: собесы. (Лучше на "вы" все-таки, но я всегда ЗА перейти на "ты" как минимум к себе)
Что вы думаете об этом? С чем согласны, с чем нет?
Ооой, очень такой интересный топик для меня.
Я часто слышу разные мнения на этот счет. Но скажу сразу, что я сторонник общения на "ты", но с некоторыми важными поинтами.
Поехали.
1. Это помогает легче влиться в коллектив и дает важное ощущение комфорта. Тебе не надо думать с кем поздороваться "привет", а с кем только "здравствуйте". Хотя в "привет" нет ничего такого от слова вообще, это не показатель неуважения))
2. Сразу скажу, что я рос в очень воспитанной семье и всегда говорил "здравствуйте". Без зумерских приколов, которые сейчас обсуждаются, что они и с учителями/преподователями на "ты" и пытаются быть своими в доску с первых секунд. Это неправильно, достаточно быть просто воспитанным, остальное придет.
3. "Я тебе друг что-ли, что ты так обращаешься".
Вот это лютый пиздец по-моему мнению. Такие люди в основном с синдромом вахтера и короной на голове. В первую очередь они не в ладах с собой, раз им необходимо чувствовать власть и доминацию над кем-то.
Важный поинт
- Мы не говорим про менеджеров ультра высокого уровня
- Я не говорю про ИБ-шников (Все с кем я общался, очень специфичные люди)
- Исключаем случаи, когда ты стажер и пошел к юнит хеду спросить как у него дела
Я общался с юнит хэдами в Озоне и МТС-е, и с большинством - мне было легко. Очень здорово видеть в собеседнике умного человека, который не пытается тебя задушить. Напротив, общаясь на одном уровне ты только и думаешь: блин, вот [ он | она ] крут [ой | ая]. К таким людям кайф тянуться, а если они лидят тебя - так вообще супер, когда перед тобой такой лидер!
4. Как осторожничать, если не знаешь возможную реакцию?
4.1. Я искренне люблю слово "приветствую", нравится оно мне, золотая середина между привет и здравствуйте.
4.2. Начать со "Здравствуйте", посмотреть на вайб и по интуиции проявить инициативу: "не против если будем на ты?"
5. "А вот если коллектив разного возраста?"
А вот Маринке с соседнего отдела N лет, че мне ее на "ты" называть?
Блин, я ничего не вижу плохого в том, чтобы проявить инициативу, если оба потенциально расположены к этому. На крайний случай всегда можно откатиться назад. А порой проявленная инициатива служит улучшением коммуникаций в коллективе и разрушению барьеров.
Может Маринке кайф быть с вами на одной волне и не чувствовать себя "старше".
Важный поинт
Вы должны быть всегда уважительны и не переходить какие-то личные границы любого человека как и лезть ему под кожу. Если сдружитесь и так общение перейдет на новый уровень.
Важный поинт
Я не отрицаю, а наоборот поддерживаю личные границы каждого. Все люди разные и если кому-то КОМФОРТНЕЕ быть на "вы" в диалоге - без проблем. Комфорт - это здоровая причина.
Еще что добавил бы в особенные случаи: собесы. (Лучше на "вы" все-таки, но я всегда ЗА перейти на "ты" как минимум к себе)
Что вы думаете об этом? С чем согласны, с чем нет?
❤19🤔4👍1😢1
Задачки с собесов ч.1
Пора выкладывать мои задачи с собеседований, а раз собесов было больше 45 в свое время, то и задач у меня достаточно. Часть успел поскринить, часть нет.
Я тут пока эксперементирую с форматами, немного деталей
• Буду прикладывать сразу несколько задачек из пула [ intern | junior | middle | senior ] чтобы всем было интересно
• Визуальная часть остается - смотрим глазками
• Прикрепляю файлы маркдаун, внутри тоже самое + код для создания таблиц
• Также прикрепляю решение в маркдауне
• Задачки актуальные и по сей день, поэтому смотрим
За идею спасибо одному подписчику - он подсветил, что было бы круто иметь код код для создания таблиц к задачкам чтобы можно было у себя потрогать и порешать.
Пора выкладывать мои задачи с собеседований, а раз собесов было больше 45 в свое время, то и задач у меня достаточно. Часть успел поскринить, часть нет.
Я тут пока эксперементирую с форматами, немного деталей
• Буду прикладывать сразу несколько задачек из пула [ intern | junior | middle | senior ] чтобы всем было интересно
• Визуальная часть остается - смотрим глазками
• Прикрепляю файлы маркдаун, внутри тоже самое + код для создания таблиц
• Также прикрепляю решение в маркдауне
• Задачки актуальные и по сей день, поэтому смотрим
- Люди не связанные с айти - делаем умный вид (я так часто делаю)
- Супер новички - сохраняем, разбираем, развиваем насмотренность. Задаем вопросы - здесь никто не кусается, комьюнити расчитано на разные уровни
- Джуны - активно штурмуем
- Миддлы и выше - практикуемся, удивляемся, что не смогли решить
За идею спасибо одному подписчику - он подсветил, что было бы круто иметь код код для создания таблиц к задачкам чтобы можно было у себя потрогать и порешать.
🔥37❤9
Топ 5 вопросов по SQL ч.1
Что чаще всего спрашивают на собесах? Да вот самую базу и спрашивают на самом деле
1. Чем отличаются WHERE и HAVING?
2. Различия обычного подзапроса и коррелированного подзапроса?
3. Что такое индексы и зачем они нужны?
4. Различия UNION, UNION ALL?
5. Что есть нормализация и денормализация базы данных?
Сначала пытаемся ответить сами, потом сверяемся с моими ответами
Что чаще всего спрашивают на собесах? Да вот самую базу и спрашивают на самом деле
1. Чем отличаются WHERE и HAVING?
2. Различия обычного подзапроса и коррелированного подзапроса?
3. Что такое индексы и зачем они нужны?
4. Различия UNION, UNION ALL?
5. Что есть нормализация и денормализация базы данных?
Сначала пытаемся ответить сами, потом сверяемся с моими ответами
❤🔥27👍8
Отпуска или "как не выгорать?"
Под одним из постов подписчица спросила про планирование отпусков,
Действительно, именно путешествия позволяют мне глобально перезагрузиться.
Рассказываю секрет, что делаю я.
1. Смотрим на производственный календарик, ищем праздники и выходные с чем можно скомбинировать свой отпуск.
2. Математика. У меня 28 + 3 отпускных дней, бьем на [ 14 | 5 | 5 | 5 | 2 ] (по возможности комбиним с праздниками)
Сразу предвижу тысячу вопросов.
3. 1-4 отпуска на 5 дней за свой счет
А если можем себе позволить сберечь менталку, почему нет?
В худшем случае у вас будет 5 полноценных недель отдыха.
А в лучшем 9 недель (Помним про праздники и оф. выходные)
Касаемо именно планирования:
- точно 1-2 кусочка беру под горнолыжки зимой
- кусочек весной
- летом 2 недели
- осень-зима по одному кусочку обычно, либо коплю для 2х недель (1 отпуск, 1 за свой счет)
Кстати очень здорово видеть вашу инициативу в виде предложенных тем.
Может еще что-то интересно? Как вы планируете отпуск? чего придерживаетесь?
Под одним из постов подписчица спросила про планирование отпусков,
Действительно, именно путешествия позволяют мне глобально перезагрузиться.
Рассказываю секрет, что делаю я.
1. Смотрим на производственный календарик, ищем праздники и выходные с чем можно скомбинировать свой отпуск.
2. Математика. У меня 28 + 3 отпускных дней, бьем на [ 14 | 5 | 5 | 5 | 2 ] (по возможности комбиним с праздниками)
Сразу предвижу тысячу вопросов.
"А если мне не одобрят 5 будних дней, согласуют только с выхами"
- Ну это жопа, у меня так было в сбере. При условии, что вообще это никак [насколько я знаю] не регулируется законом [кроме обязательной части в 14 дней]. Т.е. нет таких правил: нельзя брать только будни.
"Не разрешают комбинить с праздниками"
- Суки, у меня так было в сбере ахахаха, я терпел(
"У меня только 28 дней и то, варианты только [ 14 | 7 | 7 ]"
Так и оставляем, куда деваться. У меня есть еще пункт 3
3. 1-4 отпуска на 5 дней за свой счет
А если можем себе позволить сберечь менталку, почему нет?
В худшем случае у вас будет 5 полноценных недель отдыха.
А в лучшем 9 недель (Помним про праздники и оф. выходные)
"А как же [ болезни | непредвиденные обстоятельства ] ?"
- Я стараюсь болеть на выходных ахахаха
- Я работаю на удаленке, поэтому ибупрофен, кеторол и сиропы спасают как только можно
- Если дело касается больниц, обследований или своих дел - общаюсь с руководителями [благо они хорошие у меня], отлучаюсь и потом дорабатываю в вечернее время
Касаемо именно планирования:
- точно 1-2 кусочка беру под горнолыжки зимой
- кусочек весной
- летом 2 недели
- осень-зима по одному кусочку обычно, либо коплю для 2х недель (1 отпуск, 1 за свой счет)
Кстати очень здорово видеть вашу инициативу в виде предложенных тем.
Может еще что-то интересно? Как вы планируете отпуск? чего придерживаетесь?
👍22❤11👀1
План выполнения запроса ч. 1
(Не путаем с порядком выполнения операторов)
Если коротко - это пошаговое описание того, как база данных выполняет SQL-запрос.
Если чуть подробнее - это роадмап, показывающий, как СУБД будет обрабатывать ваш запрос, какие шаги предпримет, и какие ресурсы задействует и покажет cost (затраты на запрос)
Что показывает?
1. Какие таблицы будут задействованы.
2. Какие индексы будут использоваться.
3. Как будут объединяться данные (JOIN).
4. Сортировки и фильтрации.
5. Какие операции наиболее затратны.
СУБД создает этот план на основе своего оптимизатора запросов, чтобы найти наиболее эффективный способ выполнения.
(продолжение следует...)
(Не путаем с порядком выполнения операторов)
Если коротко - это пошаговое описание того, как база данных выполняет SQL-запрос.
Если чуть подробнее - это роадмап, показывающий, как СУБД будет обрабатывать ваш запрос, какие шаги предпримет, и какие ресурсы задействует и покажет cost (затраты на запрос)
Что показывает?
1. Какие таблицы будут задействованы.
2. Какие индексы будут использоваться.
3. Как будут объединяться данные (JOIN).
4. Сортировки и фильтрации.
5. Какие операции наиболее затратны.
СУБД создает этот план на основе своего оптимизатора запросов, чтобы найти наиболее эффективный способ выполнения.
Почему это важно?
1. Оптимизация производительности
План помогает выявить узкие места (например, дорогостоящие и болючие операции вроде Full Table Scan).
2. Устранение проблем
Например, можно обнаружить, что запрос не использует индекс, даже если он создан.
3. Экономия ресурсов
План позволяет понять, как можно снизить нагрузку на процессор и диск.
(продолжение следует...)
👍9🔥7
План выполнения запроса ч.2
Давайте разберем эту историю на примере базового запроса
Если выполнить команду EXPLAIN (в PostgreSQL, MySQL, Oracle и других СУБД), мы получим что-то вроде:
Seq Scan (Sequential Scan): База данных просканирует всю таблицу orders. Это неэффективно для больших таблиц.
• Cost: Оценка стоимости операции — чем выше, тем сложнее запрос.
• Rows: Оценка количества строк, которые вернёт запрос.
• Filter: Какой фильтр применён.
Если бы был индекс на order_date, запрос мог бы использовать Index Scan вместо полного сканирования таблицы.
Как интерпретировать план выполнения?
1. Типы сканирования:
• Seq Scan: Последовательное сканирование таблицы. Медленно на больших таблицах.
• Index Scan: Использует индекс, значительно быстрее для фильтров.
• Bitmap Index Scan: Сканирование индекса для поиска подходящих строк, объединяя их в блоки.
2. Объединение данных (JOIN):
• Nested Loop: Перебирает каждую строку одной таблицы и ищет совпадения в другой (подходит для небольших наборов данных).
• Hash Join: Создаёт хэш-таблицу из одной таблицы, затем ищет совпадения. Быстро для больших таблиц.
• Merge Join: Сортирует обе таблицы и объединяет их по порядку. Эффективно для уже отсортированных данных.
3. Операции сортировки:
• Sort: Указывает, что данные сортируются, что может быть дорогостоящей операцией.
4. Оценка стоимости:
• Общая стоимость включает чтение данных с диска, использование памяти и процессора.
Как сделать запросы эффективнее?
1. Используйте индексы.
• Создайте индексы на столбцах, которые часто участвуют в фильтрации, сортировке или JOIN.
2. Пишите запросы проще.
• Разделяйте сложные запросы на несколько шагов.
3. Не выбирайте лишние данные.
• Вместо SELECT * выбирайте конкретные столбцы:
4. Изучайте план выполнения.
• Перед оптимизацией всегда анализируйте, какие операции занимают больше всего ресурсов.
Интересные моменты из реальной практики
1. Проблема с JOIN
В одной из задач JOIN двух больших таблиц занимал часы. После анализа плана выполнения понял, что надо прикрутить индексы. После их добавления запрос стал выполняться пару минут.
2. Over-indexing
Слишком много индексов может замедлить операции INSERT и UPDATE. Анализ плана выполнения помогает понять, какие из них реально используются.
Давайте разберем эту историю на примере базового запроса
SELECT * FROM orders
WHERE order_date = '2024-01-01';
Если выполнить команду EXPLAIN (в PostgreSQL, MySQL, Oracle и других СУБД), мы получим что-то вроде:
Seq Scan on orders (cost=0.00..35.50 rows=5 width=100)
Filter: (order_date = '2024-01-01')
Seq Scan (Sequential Scan): База данных просканирует всю таблицу orders. Это неэффективно для больших таблиц.
• Cost: Оценка стоимости операции — чем выше, тем сложнее запрос.
• Rows: Оценка количества строк, которые вернёт запрос.
• Filter: Какой фильтр применён.
Если бы был индекс на order_date, запрос мог бы использовать Index Scan вместо полного сканирования таблицы.
Как интерпретировать план выполнения?
1. Типы сканирования:
• Seq Scan: Последовательное сканирование таблицы. Медленно на больших таблицах.
• Index Scan: Использует индекс, значительно быстрее для фильтров.
• Bitmap Index Scan: Сканирование индекса для поиска подходящих строк, объединяя их в блоки.
2. Объединение данных (JOIN):
• Nested Loop: Перебирает каждую строку одной таблицы и ищет совпадения в другой (подходит для небольших наборов данных).
• Hash Join: Создаёт хэш-таблицу из одной таблицы, затем ищет совпадения. Быстро для больших таблиц.
• Merge Join: Сортирует обе таблицы и объединяет их по порядку. Эффективно для уже отсортированных данных.
3. Операции сортировки:
• Sort: Указывает, что данные сортируются, что может быть дорогостоящей операцией.
4. Оценка стоимости:
• Общая стоимость включает чтение данных с диска, использование памяти и процессора.
Как сделать запросы эффективнее?
1. Используйте индексы.
• Создайте индексы на столбцах, которые часто участвуют в фильтрации, сортировке или JOIN.
CREATE INDEX idx_order_date ON orders(order_date);
2. Пишите запросы проще.
• Разделяйте сложные запросы на несколько шагов.
3. Не выбирайте лишние данные.
• Вместо SELECT * выбирайте конкретные столбцы:
SELECT order_id, order_date FROM orders;
4. Изучайте план выполнения.
• Перед оптимизацией всегда анализируйте, какие операции занимают больше всего ресурсов.
Интересные моменты из реальной практики
1. Проблема с JOIN
В одной из задач JOIN двух больших таблиц занимал часы. После анализа плана выполнения понял, что надо прикрутить индексы. После их добавления запрос стал выполняться пару минут.
2. Over-indexing
Слишком много индексов может замедлить операции INSERT и UPDATE. Анализ плана выполнения помогает понять, какие из них реально используются.
Важный поинт 1
Оптимизатор не всегда прав. Иногда оптимизатор выбирает неэффективный план. В таких случаях можно использовать хинты для принудительного выбора
Важный поинт 2
Вы как аналитик, оооочень редко будете работать прям с тем чтобы изучать план запроса и искать как его сделать лучше.
Обычно запросы не супер большие, либо под них есть удобные таблицы. И даже если вы не оптимизированно напишите запрос он будет крутиться ну пусть 10 минут вместо каких-нибудь 3. (Опять же ситуации разные могут быть)
🔥13❤5👍1