Чем отличаются WHERE и HAVING?
Это один из самых популярных вопросов на стажера, джуна и иногда мидла de/da. Я думаю, практически все знают что нужно отвечать.
Вот, например, в тг канале @data_analysis_it был дан такой ответ https://news.1rj.ru/str/data_analysis_it/83 :
Все четко и понятно.
Deepseek даст такой краткий ответ:
Примерно тоже самое.
Это база, ее обязательно надо знать. В целом такого ответа на собеседовании будет достаточно.
НО! Но я вам хочу рассказать о важном нюансе, о котором очень много инженеров не знает:
HAVING можно использовать без GROUP BY!
Пример:
В примере HAVING применяется не к группам, а ко всей таблице в целом, в данном случае группой является вся выборка. То есть в select-e выполняется просто функция, допустим count(*) , ко всем данным, но и еще можно сразу добавить фильтр по этому значению.
Вроде ничего важного, вряд ли кто-то таким образом будет использовать having без group by, просто прикольная фишка.
На самом деле данная фишка используется.
На моей прошлой работе, в одном красном банке, в архитектуре ETL была настроена система Eventwait-ов (флагов) таким образом:
Допустим у нас есть слой витрин данных, расчет таблиц в этом слое за сегодня запускается только после того, как отбежали все потоки на источниках, например, в ядре. Как это работает:
Каждые 5 минут запускается мониторинговый поток, который запускает кучу селектов и проверяет готовы ли источники.
Код там был примерно такой:
В этом запросе у нас идет сравнение по каждой таблице-источнику за отчетный день – сколько отработало сегодня потоков для ее загрузки и сколько потоков вообще грузит таблицу. Пока у нас все потоки за сегодня не прогрузят таблицу, проверочный select выдаст 0 строк. И потоки в слое витрин данных не грузят свои таблицы, пока не готовы их источники (пока в результате запроса нет строк).
Если в результате какого-нибудь select-a у нас есть число ( чаще, просто 1, тк в основном одну таблицу грузит один поток), то значит этот флаг пришел. Как только все флаги для определенного потока пришли, запускается расчет таблицы из слоя витрин.
Я не скажу, что это хорошая система. Это скорее легаси, сейчас делается по-другому. Но примерная система есть во многих «старых» компаниях.
В общем, GROUP BY для HAVING-a не обязателен.
Кстати, если у deepseek-а спросить об этом напрямую, он скажет, что можно использовать having без group by, но с оговоркой:
От себя добавлю - в Oracle это тоже работает. Так что всего проверяйте ответы нейронки😊
#Вопросы_с_собесов
Это один из самых популярных вопросов на стажера, джуна и иногда мидла de/da. Я думаю, практически все знают что нужно отвечать.
Вот, например, в тг канале @data_analysis_it был дан такой ответ https://news.1rj.ru/str/data_analysis_it/83 :
Чем отличаются WHERE и HAVING?
WHERE
• GROUP BY не обязателен
• Применяется к отдельным строкам таблицы.
• Не может использовать агрегатные функции
HAVING
• GROUP BY обязателен
• Применяется к результатам агрегатных вычислений.
• Может использовать агрегатные функции
Все четко и понятно.
Deepseek даст такой краткий ответ:
Кратко:
1. WHERE:
• Фильтрует строки до группировки или агрегации.
• Работает с отдельными строками.
• Не может использоваться с агрегатными функциями.
2. HAVING:
• Фильтрует группы или результаты агрегации после группировки.
• Работает с группами строк или агрегатными функциями.
• Используется только с GROUP BY или агрегатными функциями.
Главное: WHERE — для строк, HAVING — для групп. 😊
Примерно тоже самое.
Это база, ее обязательно надо знать. В целом такого ответа на собеседовании будет достаточно.
НО! Но я вам хочу рассказать о важном нюансе, о котором очень много инженеров не знает:
HAVING можно использовать без GROUP BY!
Пример:
select max(campaign_id) from public.costs
having max(campaign_id)>2
--Результат 100.
select count(campaign_id) from public.costs
having count(campaign_id)>1000
--Результат 39300
В примере HAVING применяется не к группам, а ко всей таблице в целом, в данном случае группой является вся выборка. То есть в select-e выполняется просто функция, допустим count(*) , ко всем данным, но и еще можно сразу добавить фильтр по этому значению.
Вроде ничего важного, вряд ли кто-то таким образом будет использовать having без group by, просто прикольная фишка.
На самом деле данная фишка используется.
На моей прошлой работе, в одном красном банке, в архитектуре ETL была настроена система Eventwait-ов (флагов) таким образом:
Допустим у нас есть слой витрин данных, расчет таблиц в этом слое за сегодня запускается только после того, как отбежали все потоки на источниках, например, в ядре. Как это работает:
Каждые 5 минут запускается мониторинговый поток, который запускает кучу селектов и проверяет готовы ли источники.
Код там был примерно такой:
-- проверка логов за сегодня по каждой таблице
select count(t2.job_id)
from control.workflow t1 inner join control.log_loading t2 ...
where t1.workflow_name = t2.workflow_name
and t2.loading_id = ($$p_ loading_id)
and t2.status = 'succeeded'
...
and t1.table_name = 'table_name'
and t2.operation_day = to_date('$$p_operation_day","yyyymmdd')
having count(t2.job_id) >=
-- смотрим сколько всего потоков должно грузить таблицу (число фиксированное)
(select count(workflow_name)
from control.md_workflow t1
where table_owner = 'table_owner'
and table_name = 'table_name')
В этом запросе у нас идет сравнение по каждой таблице-источнику за отчетный день – сколько отработало сегодня потоков для ее загрузки и сколько потоков вообще грузит таблицу. Пока у нас все потоки за сегодня не прогрузят таблицу, проверочный select выдаст 0 строк. И потоки в слое витрин данных не грузят свои таблицы, пока не готовы их источники (пока в результате запроса нет строк).
Если в результате какого-нибудь select-a у нас есть число ( чаще, просто 1, тк в основном одну таблицу грузит один поток), то значит этот флаг пришел. Как только все флаги для определенного потока пришли, запускается расчет таблицы из слоя витрин.
Я не скажу, что это хорошая система. Это скорее легаси, сейчас делается по-другому. Но примерная система есть во многих «старых» компаниях.
В общем, GROUP BY для HAVING-a не обязателен.
Кстати, если у deepseek-а спросить об этом напрямую, он скажет, что можно использовать having без group by, но с оговоркой:
В большинстве СУБД (например, PostgreSQL, MySQL) это допустимо, но в некоторых (например, Oracle) может вызвать ошибку»
От себя добавлю - в Oracle это тоже работает. Так что всего проверяйте ответы нейронки😊
#Вопросы_с_собесов
👍5🔥4❤2
Предыстория: 📚
Книги я особо не читаю. Начал читать в 20+ лет и только в последний год читаю одну книгу в два месяца. Читаю художественную литературу (нравится больше всего), техническую и историческую.
Бизнесовую/саморазвития/психологическую литературу не очень люблю. Как-то начал читать всеми известную «Богатый папа, бедный папа». Прочитал страниц 15 и бросил. Банальщина... 🙄
Недавно купил еще одну классику «Думай и богатей» (авт. Наполеон Хилл), просто ради интереса. Это похоже на прародителя инфоцыган, там есть основные заповеди для достижения цели – мечтай, воображай, верь и перечитывай эту книгу каждый день.. 🫢
Но читается легко. Там приводятся в пример истории реальных людей, и это иногда интересно. 🧐
Зачем я об этом вообще пишу:
Книга 1937 года! И вот вчера я наткнулся на такой абзац ( фото в закрепе).
Почти 100 лет назад в Америке уже учили, как составлять резюме и продавать себя. Многое из рекомендаций сейчас, конечно, неактуально – печать резюме на дорогой бумаге, класть его в очень дорогую, красивую папку, делать фото в крутой студии и т.д.
Просто как факт, 100 лет назад в США уже была корпоративная культура, многие люди уже были заряжены на построение успешной карьеры. 💼✨
А до нашей страны это дошло недавно. Ну, наверное, лет 20 назад (можете поправить)..
В России всё только зарождается, и у нас есть большие перспективы преуспеть в корпоративной культуре. Но считаю нормальным и очень полезным перенимать опыт западных стран, модифицировать, улучшать и применять его у нас. 🌍🚀
Что думаете? 🤔 Может, у вас есть свои примеры или мысли на эту тему? 💭
#книги
Книги я особо не читаю. Начал читать в 20+ лет и только в последний год читаю одну книгу в два месяца. Читаю художественную литературу (нравится больше всего), техническую и историческую.
Бизнесовую/саморазвития/психологическую литературу не очень люблю. Как-то начал читать всеми известную «Богатый папа, бедный папа». Прочитал страниц 15 и бросил. Банальщина... 🙄
Недавно купил еще одну классику «Думай и богатей» (авт. Наполеон Хилл), просто ради интереса. Это похоже на прародителя инфоцыган, там есть основные заповеди для достижения цели – мечтай, воображай, верь и перечитывай эту книгу каждый день.. 🫢
Но читается легко. Там приводятся в пример истории реальных людей, и это иногда интересно. 🧐
Зачем я об этом вообще пишу:
Книга 1937 года! И вот вчера я наткнулся на такой абзац ( фото в закрепе).
Почти 100 лет назад в Америке уже учили, как составлять резюме и продавать себя. Многое из рекомендаций сейчас, конечно, неактуально – печать резюме на дорогой бумаге, класть его в очень дорогую, красивую папку, делать фото в крутой студии и т.д.
Просто как факт, 100 лет назад в США уже была корпоративная культура, многие люди уже были заряжены на построение успешной карьеры. 💼✨
А до нашей страны это дошло недавно. Ну, наверное, лет 20 назад (можете поправить)..
В России всё только зарождается, и у нас есть большие перспективы преуспеть в корпоративной культуре. Но считаю нормальным и очень полезным перенимать опыт западных стран, модифицировать, улучшать и применять его у нас. 🌍🚀
Что думаете? 🤔 Может, у вас есть свои примеры или мысли на эту тему? 💭
#книги
👍7🔥2🤯2
Вопросы про джоины:
Буду делать серию постов про самые популярные вопросы по sql секции.
Я думаю, на любом собесе будут вопросы про джоины. Давайте разберем популярные вопросы/задачи:
1) Минимальное и максимальное количество строк в результате джоинов.
Допустим левая таблица t1 (поле id) – 100 строк, правая таблица t2 (id) – 10 строк
inner join:
Min – 0 строк. Если никаких пересечений нет, в двух таблицах нет одинаковых id.
Max – 1000 строк. Если в двух таблицах только одно значение (например, 1). Просто делаем перемножение.
left join:
Min – 100 строк. Если никаких пересечений нет, в результате будут все значения из левой таблицы.
Max – 1000 строк. Если в двух таблицах только одно значение. Делаем перемножение.
right join:
Min – 10 строк. Если никаких пересечений нет, в результате будут все значения из правой таблицы
Max – 1000 строк. Если в двух таблицах только одно значение. Делаем перемножение.
full join:
Min – 100 строк. Вот этот момент важно понять, на нем часто допускают ошибки. Минимальное количество при full join будет – количество строк из большей таблицы. Например, в левой таблице значения от 1 до 100, а в правой от 1 до 10.
Max – 1000 строк. Если в двух таблицах только одно значение. Делаем перемножение.
cross join:
Min и Max – 1000 строк. Делаем перемножение.
2) Сколько строк вернет операция FULL JOIN, если известно следующее:
INNER JOIN - 6 строк
LEFT JOIN - 10 строк
RIGHT JOIN - 12 строк
Давайте попробуем ее решить без запоминаний и просто понять.
Если вспомнить круги Эйлера (о их корректности будет отдельный пост):
FULL JOIN – это левая непересекающаяся часть + средняя пересекающаяся часть + правая непересекающаяся часть. Просуммируем эти три части:
FULL JOIN = (LEFT JOIN - INNER JOIN) + (INNER JOIN) + (RIGHT JOIN - INNER JOIN)
FULL JOIN = (10 - 6) + (6) + (12-6)
FULL JOIN = 16
Также если раскрыть скобки, то можно понять, что по сути
FULL JOIN = (RIGHT JOIN) + (LEFT JOIN) – (INNER JOIN) = 10 + 12 – 6 = 16
3) Заполнение результата после всех видов джоинов.
Такую задачу тоже часто дают, здесь важно не запутаться. Я приложил скрин с результатами джоинов, внимательно изучите. Особенно обратите внимание на результат соединения дублей и null-ов.
Расскажите какие у вас были интересные вопросы про джоины: 💭
#Вопросы_с_собесов
Буду делать серию постов про самые популярные вопросы по sql секции.
Я думаю, на любом собесе будут вопросы про джоины. Давайте разберем популярные вопросы/задачи:
1) Минимальное и максимальное количество строк в результате джоинов.
Допустим левая таблица t1 (поле id) – 100 строк, правая таблица t2 (id) – 10 строк
inner join:
Min – 0 строк. Если никаких пересечений нет, в двух таблицах нет одинаковых id.
Max – 1000 строк. Если в двух таблицах только одно значение (например, 1). Просто делаем перемножение.
left join:
Min – 100 строк. Если никаких пересечений нет, в результате будут все значения из левой таблицы.
Max – 1000 строк. Если в двух таблицах только одно значение. Делаем перемножение.
right join:
Min – 10 строк. Если никаких пересечений нет, в результате будут все значения из правой таблицы
Max – 1000 строк. Если в двух таблицах только одно значение. Делаем перемножение.
full join:
Min – 100 строк. Вот этот момент важно понять, на нем часто допускают ошибки. Минимальное количество при full join будет – количество строк из большей таблицы. Например, в левой таблице значения от 1 до 100, а в правой от 1 до 10.
Max – 1000 строк. Если в двух таблицах только одно значение. Делаем перемножение.
cross join:
Min и Max – 1000 строк. Делаем перемножение.
2) Сколько строк вернет операция FULL JOIN, если известно следующее:
INNER JOIN - 6 строк
LEFT JOIN - 10 строк
RIGHT JOIN - 12 строк
Давайте попробуем ее решить без запоминаний и просто понять.
Если вспомнить круги Эйлера (о их корректности будет отдельный пост):
FULL JOIN – это левая непересекающаяся часть + средняя пересекающаяся часть + правая непересекающаяся часть. Просуммируем эти три части:
FULL JOIN = (LEFT JOIN - INNER JOIN) + (INNER JOIN) + (RIGHT JOIN - INNER JOIN)
FULL JOIN = (10 - 6) + (6) + (12-6)
FULL JOIN = 16
Также если раскрыть скобки, то можно понять, что по сути
FULL JOIN = (RIGHT JOIN) + (LEFT JOIN) – (INNER JOIN) = 10 + 12 – 6 = 16
3) Заполнение результата после всех видов джоинов.
Такую задачу тоже часто дают, здесь важно не запутаться. Я приложил скрин с результатами джоинов, внимательно изучите. Особенно обратите внимание на результат соединения дублей и null-ов.
Расскажите какие у вас были интересные вопросы про джоины: 💭
#Вопросы_с_собесов
🔥8👍3❤2
Вакансия: Senior DWH разработчик
Компания: Магнит TECH
Предполагаемая вилка: от 270к на руки
Период собеседования: Декабрь 2024
Формат работы: Удаленная работа
Этапы собеседований:
HR -> Tech Interview -> Offer
Краткая справка о процессе интервью:
Собеседовал тех лид команды, который был очень технически подкован. Тех лид задавал интересные вопросы про опыт работы, моделирование, индексы, оптимизацию, план запроса и дал пару задачек. То есть он не просто задавал банальные вопросы, а копал все глубже и глубже, чтоб понять уровень знаний. И большой респект, что сам давал какие-то ответы и объяснял технические нюансы.
Более подробно:
Я рассказал о своем опыте. Тех лида заинтересовал опыт с созданием с нуля витрины данных. Он спрашивал про выбор модели, как я оценивал объем данных и прогнозировал что будет через год. Спрашивал про типы полей, размерности, индексы.
Блок про моделирование. Снежинка/звезда/ - где что используются, плюсы и минусы. Data vault- что это и за счет чего достигается гибкость.
Большой блок вопросов про внутренности БД - про план запроса, статистику, кардиналити, какие бывают методы доступа к таблицам. Индексы – что это и какие виды знаю, чем отличается бинарное дерево от сбалансированного, сколько уровней в сбалансированном дереве, битмап индекс. Методы физического соединения – какие есть виды(по каждому виду задавал много вопросов), какой метод соединения предпочтителен при соединении больших таблиц (важно учитывать какая СУБД), что такое хэш мапа, почему по ней быстрый поиск.
Когда говорили про переезд в облако, собеседующий сказал, что до конца не решили на какой стек они переедут. Активно занимаются этим вопросом. Смотрят на опыт других больших компаний. DWH на GP не хотят мигрировать. Сказал, что очень много косяков с GP и он считает, что многие компании тоже от GP откажутся.
В конце дал две несложных задачки на джоины и оконки.
Через неделю пришел отказ, так как магнит тех переезжает в облако и им нужен более опытный инженер (ближе к архитектору), который также шарит за S3 и желательно Impala.
Люблю такие собесы – получается бесплатная проверка знаний + собеседующий много всего сам объяснил и сказал, что можно изучить. Отношение к компании улучшилось.
Еще из интересного вакансию нашел не на hh, а на их сайте и сам отправил свое резюме.
*идея позаимствована у https://news.1rj.ru/str/get_rejected
#Собес
Компания: Магнит TECH
Предполагаемая вилка: от 270к на руки
Период собеседования: Декабрь 2024
Формат работы: Удаленная работа
Этапы собеседований:
HR -> Tech Interview -> Offer
Краткая справка о процессе интервью:
Собеседовал тех лид команды, который был очень технически подкован. Тех лид задавал интересные вопросы про опыт работы, моделирование, индексы, оптимизацию, план запроса и дал пару задачек. То есть он не просто задавал банальные вопросы, а копал все глубже и глубже, чтоб понять уровень знаний. И большой респект, что сам давал какие-то ответы и объяснял технические нюансы.
Более подробно:
Я рассказал о своем опыте. Тех лида заинтересовал опыт с созданием с нуля витрины данных. Он спрашивал про выбор модели, как я оценивал объем данных и прогнозировал что будет через год. Спрашивал про типы полей, размерности, индексы.
Блок про моделирование. Снежинка/звезда/ - где что используются, плюсы и минусы. Data vault- что это и за счет чего достигается гибкость.
Большой блок вопросов про внутренности БД - про план запроса, статистику, кардиналити, какие бывают методы доступа к таблицам. Индексы – что это и какие виды знаю, чем отличается бинарное дерево от сбалансированного, сколько уровней в сбалансированном дереве, битмап индекс. Методы физического соединения – какие есть виды(по каждому виду задавал много вопросов), какой метод соединения предпочтителен при соединении больших таблиц (важно учитывать какая СУБД), что такое хэш мапа, почему по ней быстрый поиск.
Когда говорили про переезд в облако, собеседующий сказал, что до конца не решили на какой стек они переедут. Активно занимаются этим вопросом. Смотрят на опыт других больших компаний. DWH на GP не хотят мигрировать. Сказал, что очень много косяков с GP и он считает, что многие компании тоже от GP откажутся.
В конце дал две несложных задачки на джоины и оконки.
Через неделю пришел отказ, так как магнит тех переезжает в облако и им нужен более опытный инженер (ближе к архитектору), который также шарит за S3 и желательно Impala.
Люблю такие собесы – получается бесплатная проверка знаний + собеседующий много всего сам объяснил и сказал, что можно изучить. Отношение к компании улучшилось.
Еще из интересного вакансию нашел не на hh, а на их сайте и сам отправил свое резюме.
*идея позаимствована у https://news.1rj.ru/str/get_rejected
#Собес
1🔥10👍3❤2
Недавний пост про джоины набрал много просмотров и репостов. Значит такая информация интересна.
Продолжим наваливать базу 🤝
Популярные вопросы с собесов (lvl junior):
1) В какой последовательности СУБД на самом деле выполняет команды запроса:
Ответ:
Порядок выполнения SQL-запроса:
1. FROM (и JOIN) – выбираются таблицы и соединяются
2. WHERE – фильтруются строки
3. GROUP BY – группировка данных
4. HAVING – фильтрация групп
5. SELECT – выбор полей (включая вычисляемые)
6. DISTINCT – удаление дубликатов
7. ORDER BY – сортировка результатов
8. LIMIT / OFFSET – ограничение вывода
Более удобный вид:
2) UNION ALL vs UNION - в чем разница?
UNION ALL:
• Не удаляет дубликаты
• Работает быстро (простое объединение)
• Сохраняет исходный порядок строк
• Используется, когда важна скорость и нужны все данные
UNION
• Удаляет повторяющиеся строки
• Работает медленно - требует сортировки (ресурсозатратно)
• Может изменить порядок строк
• Используется, когда нужны уникальные записи
Также могут дать простую задачку:
Ответ:
Будет работать если тип полей в таблицах одинаковый (но возможно некоторые СУБД итак могут сделать неявное преобразование).
Вернется 2 строки:
13 14
13 15
3) Отличие UPDATE TABLE от ALTER TABLE.
Немного странный вопрос, но в этом и прикол. Некоторые джуны на нем тупят 😄
UPDATE TABLE:
• Изменяет сами данные в таблице (строки)
• Пример: UPDATE users SET age = 30 WHERE id = 1;
• Тип операции - DML (Data Manipulation Language). Поэтому операции нужно COMMIT-ть или при необходимости можно откатить - ROLLBACK
• Блокирует строки (зависит от СУБД). *Про блокировки сделаю отдельный пост, тема непростая.
ALTER TABLE:
• Изменяет структуру таблицы (добавить/удалить/изменить поле, ограничение, партицию, переименование таблицы и тд.).
• Пример: ALTER TABLE users ADD COLUMN email VARCHAR(100);
• Тип операции - DDL (Data Definition Language). Авто COMMIT, откатить нельзя (но есть нюансы, зависит от СУБД)
• Может блокировать всю таблицу
Подскажите плз вам интересна эта тема? Предлагайте свои варианты по чему можно навалить базы?
#Вопросы_с_собесов #база #sql #jun
Продолжим наваливать базу 🤝
Популярные вопросы с собесов (lvl junior):
1) В какой последовательности СУБД на самом деле выполняет команды запроса:
select distinct
from
join
where
group by
having
order by
limit
Ответ:
Порядок выполнения SQL-запроса:
1. FROM (и JOIN) – выбираются таблицы и соединяются
2. WHERE – фильтруются строки
3. GROUP BY – группировка данных
4. HAVING – фильтрация групп
5. SELECT – выбор полей (включая вычисляемые)
6. DISTINCT – удаление дубликатов
7. ORDER BY – сортировка результатов
8. LIMIT / OFFSET – ограничение вывода
Более удобный вид:
FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT
2) UNION ALL vs UNION - в чем разница?
UNION ALL:
• Не удаляет дубликаты
• Работает быстро (простое объединение)
• Сохраняет исходный порядок строк
• Используется, когда важна скорость и нужны все данные
UNION
• Удаляет повторяющиеся строки
• Работает медленно - требует сортировки (ресурсозатратно)
• Может изменить порядок строк
• Используется, когда нужны уникальные записи
Также могут дать простую задачку:
Даны таблицы T1(col1, col2), T2(col1, col3).
Наполнение таблиц:
T1
(13, 15)
(13, 15)
(13, 15)
T2
(13, 15)
(13, 14)
Будет ли работать запрос? Если будет работать, то сколько строк вернет?
SELECT * FROM T1
UNION
SELECT * FROM T2
Ответ:
Будет работать если тип полей в таблицах одинаковый (но возможно некоторые СУБД итак могут сделать неявное преобразование).
Вернется 2 строки:
13 14
13 15
3) Отличие UPDATE TABLE от ALTER TABLE.
Немного странный вопрос, но в этом и прикол. Некоторые джуны на нем тупят 😄
UPDATE TABLE:
• Изменяет сами данные в таблице (строки)
• Пример: UPDATE users SET age = 30 WHERE id = 1;
• Тип операции - DML (Data Manipulation Language). Поэтому операции нужно COMMIT-ть или при необходимости можно откатить - ROLLBACK
• Блокирует строки (зависит от СУБД). *Про блокировки сделаю отдельный пост, тема непростая.
ALTER TABLE:
• Изменяет структуру таблицы (добавить/удалить/изменить поле, ограничение, партицию, переименование таблицы и тд.).
• Пример: ALTER TABLE users ADD COLUMN email VARCHAR(100);
• Тип операции - DDL (Data Definition Language). Авто COMMIT, откатить нельзя (но есть нюансы, зависит от СУБД)
• Может блокировать всю таблицу
Подскажите плз вам интересна эта тема? Предлагайте свои варианты по чему можно навалить базы?
#Вопросы_с_собесов #база #sql #jun
👍25🔥11💅4⚡1
Прошла ровно неделя с момента создания, а к каналу 🐧 присоединилось уже 88 человек (будет круто если сегодня до 100 дойдем 😁).
Отличный результат, спасибо!🔥
Давайте проведем несколько опросов, чтоб понимать какая у нас аудитория и какие интересы.
* свои варианты опросов можете тоже предлагать
Отличный результат, спасибо!
Давайте проведем несколько опросов, чтоб понимать какая у нас аудитория и какие интересы.
* свои варианты опросов можете тоже предлагать
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3❤2👍2
Какие посты интересны?
Anonymous Poll
64%
наваливание базы для молодых бойцов
67%
вопросы/задачи с собесов
58%
обзор пройденных собеседований
39%
обзор технологий и всяких теоретических штук
55%
ссылки и обзор полезных материалов (курсы, книги)/инструменты
57%
разное техническое - задачи/пет проекты/ и тд
37%
мой путь в it
17%
не айтишное и личное
1%
свой вариант в комменты
Когда чуть подразгребу дела и пройду испыталку (летом) готов ради контента пройти 7 кругов ада (собесов) ради контента 😱
На какой грейд интересны собесы?
На какой грейд интересны собесы?
Anonymous Poll
39%
джун
65%
мидл
30%
синьор
2%
неинтересно
Коллеги, спасибо за прохождение опросов 😊 . Данные приняты к сведению, будем работать ✊
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝4👍1🔥1
Вчера наткнулся на интересную статью и решил поделиться с вами (украсть💅 ) .
Статья взята из блога Senior-а DE из Spotify https://luminousmen.com, рекомендую.
Статья взята из блога Senior-а DE из Spotify https://luminousmen.com, рекомендую.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4👍1💅1
Ч.1.
INSERT и UPDATE и их влияние на прием данных
«С чем сложнее работать базе данных — INSERT с данными или UPDATE?»
Сначала вы можете подумать: «А какое это имеет значение? Они служат разным целям, верно?» INSERT добавляет новые строки и UPDATE изменяет существующие — дело закрыто. Когда вы загружаете данные в систему — синхронизируете внешние источники, вставляете данные или обновляете аналитические таблицы — выбор между INSERT и UPDATE может существенно повлиять на производительность и масштабируемость вашей базы данных.
Операция INSERT
На первый взгляд, INSERT кажется, все просто — добавить новую строку в систему. Но если заглянуть под капот, то все сложнее, чем может показаться.
Индексы
Когда вы вставляете строку, это не просто добавление данных в таблицу. Движок базы данных также должен обновить все связанные индексы. Если вы думаете об индексах как о каталогах, то каждая новая запись должна быть аккуратно помещена на свое правильное место, гарантируя, что каталог останется отсортированным и полезным.
Больше индексов означает больше накладных расходов. Каждый дополнительный индекс требует дополнительных усилий для расчета, поиска и хранения новых данных. В то время как индекс с одним столбцом обновляется относительно быстро, составные или уникальные индексы (например, (user_id, created_at)) добавляют сложности и задержки.
💡 Избегайте слепого добавления индексов. Каждый из них повышает производительность запросов, но замедляет INSERT. Стремитесь к балансу.
Ограничения и триггеры
Прежде чем новые данные официально попадут в таблицу, они должны пройти несколько проверок целостности. Эти ограничения включают внешние ключи для обеспечения связей, UNIQUE ограничения для предотвращения дублирования записей и NOT NULL требования для обеспечения качества данных. Если схема включает вычисляемые столбцы, база данных должна вычислять их значения на лету.
Кроме того, триггеры могут выполнять пользовательскую логику во время вставки, например, ведение журнала или каскадные обновления (или любую другую пользовательскую логику, которая у вас может быть). Хотя они полезны, они могут значительно увеличить рабочую нагрузку, особенно для сложных схем данных.
Параллелизм
INSERT Операции, как правило, хорошо взаимодействуют с блокировками, используя минимальные механизмы блокировки, такие как блокировки строк или страниц . Однако параллелизм все еще может вызывать головную боль в системах с высокой нагрузкой. Если несколько потоков одновременно пытаются вставить данные в одну и ту же таблицу или раздел, может возникнуть конфликт блокировок. Или, что еще хуже, взаимоблокировки — когда две транзакции блокируют друг друга на неопределенный срок.
💡 Для сред с высоким уровнем параллелизма:
1. Используйте пакетирование для массовых вставок.
2. Рассмотрите возможность секционирования или сегментирования для распределения нагрузки.
Раздувание хранилища
Массовые вставки или частые небольшие вставки могут со временем привести к раздуванию таблицы при увеличении ее физического размера, даже если объем полезных данных в таблице может и не увеличиться существенно:
Фрагментация : частые вставки могут фрагментировать базовое хранилище, снижая производительность последующих операций чтения и записи.
Раздувание : таблицы без надлежащего обслуживания (например, периодической очистки или архивации) могут неоправданно разрастаться, занимая место в хранилище и снижая производительность.
💡 Планируйте регулярные задачи по обслуживанию, такие как VACUUM, ANALYZE или архивирование, чтобы бороться с раздуванием и фрагментацией. Однако будьте осторожны — эти операции могут полностью заблокировать вашу базу данных.
INSERT и UPDATE и их влияние на прием данных
«С чем сложнее работать базе данных — INSERT с данными или UPDATE?»
Сначала вы можете подумать: «А какое это имеет значение? Они служат разным целям, верно?» INSERT добавляет новые строки и UPDATE изменяет существующие — дело закрыто. Когда вы загружаете данные в систему — синхронизируете внешние источники, вставляете данные или обновляете аналитические таблицы — выбор между INSERT и UPDATE может существенно повлиять на производительность и масштабируемость вашей базы данных.
Операция INSERT
На первый взгляд, INSERT кажется, все просто — добавить новую строку в систему. Но если заглянуть под капот, то все сложнее, чем может показаться.
Индексы
Когда вы вставляете строку, это не просто добавление данных в таблицу. Движок базы данных также должен обновить все связанные индексы. Если вы думаете об индексах как о каталогах, то каждая новая запись должна быть аккуратно помещена на свое правильное место, гарантируя, что каталог останется отсортированным и полезным.
Больше индексов означает больше накладных расходов. Каждый дополнительный индекс требует дополнительных усилий для расчета, поиска и хранения новых данных. В то время как индекс с одним столбцом обновляется относительно быстро, составные или уникальные индексы (например, (user_id, created_at)) добавляют сложности и задержки.
💡 Избегайте слепого добавления индексов. Каждый из них повышает производительность запросов, но замедляет INSERT. Стремитесь к балансу.
Ограничения и триггеры
Прежде чем новые данные официально попадут в таблицу, они должны пройти несколько проверок целостности. Эти ограничения включают внешние ключи для обеспечения связей, UNIQUE ограничения для предотвращения дублирования записей и NOT NULL требования для обеспечения качества данных. Если схема включает вычисляемые столбцы, база данных должна вычислять их значения на лету.
Кроме того, триггеры могут выполнять пользовательскую логику во время вставки, например, ведение журнала или каскадные обновления (или любую другую пользовательскую логику, которая у вас может быть). Хотя они полезны, они могут значительно увеличить рабочую нагрузку, особенно для сложных схем данных.
Параллелизм
INSERT Операции, как правило, хорошо взаимодействуют с блокировками, используя минимальные механизмы блокировки, такие как блокировки строк или страниц . Однако параллелизм все еще может вызывать головную боль в системах с высокой нагрузкой. Если несколько потоков одновременно пытаются вставить данные в одну и ту же таблицу или раздел, может возникнуть конфликт блокировок. Или, что еще хуже, взаимоблокировки — когда две транзакции блокируют друг друга на неопределенный срок.
💡 Для сред с высоким уровнем параллелизма:
1. Используйте пакетирование для массовых вставок.
2. Рассмотрите возможность секционирования или сегментирования для распределения нагрузки.
Раздувание хранилища
Массовые вставки или частые небольшие вставки могут со временем привести к раздуванию таблицы при увеличении ее физического размера, даже если объем полезных данных в таблице может и не увеличиться существенно:
Фрагментация : частые вставки могут фрагментировать базовое хранилище, снижая производительность последующих операций чтения и записи.
Раздувание : таблицы без надлежащего обслуживания (например, периодической очистки или архивации) могут неоправданно разрастаться, занимая место в хранилище и снижая производительность.
💡 Планируйте регулярные задачи по обслуживанию, такие как VACUUM, ANALYZE или архивирование, чтобы бороться с раздуванием и фрагментацией. Однако будьте осторожны — эти операции могут полностью заблокировать вашу базу данных.
🔥4👍2❤1
Ч.2.
Операция UPDATE
При UPDATE изменяются уже существующие — и вот тут-то все становится сложнее. UPDATE Операции часто задействуют несколько подсистем в базе данных, что делает их ресурсоемкими.
Нахождение строк
Каждый UPDATE начинается с поиска. Механизм базы данных должен найти точные строки, которые соответствуют WHERE предложению.
Если WHERE предложение нацелено на индексированные столбцы, это может быть относительно эффективно. Однако, если запрос фильтрует неиндексированные столбцы, движку может потребоваться некоторое время для сканирования всей таблицы. На небольших наборах данных это управляемо, но по мере роста таблицы процесс поиска может стать мучительно медленным.
💡 Плохо оптимизированные запросы или отсутствующие индексы могут увеличить стоимость поиска строк, что значительно повлияет на производительность. Опять же, оптимизацию часто нужно выполнять в пространстве между монитором и креслом.
Индексированные столбцы
Хотя индексы отлично подходят для ускорения поиска, при их изменении они добавляют значительные накладные расходы. База данных должна не только обновить строку, но и пересмотреть каждый связанный индекс. Следовательно, обновление индексированных столбцов может быть медленным.
Для составных индексов сложность умножается. Обновление одного значения может привести к пересчету и изменению положения записи индекса. Чем больше индексов привязано к столбцу, тем больше времени база данных тратит на перетасовку данных, замедляя UPDATE.
Параллелизм
В отличие от относительно дружественных к параллелизму операций INSERT, UPDATE операции могут быть блокировочными. Чтобы обеспечить целостность данных, база данных часто блокирует обновляемые ею строки, не давая другим операциям изменять их одновременно. Для небольших таблиц с низким трафиком это нормально. Но в средах с высоким параллелизмом эти блокировки могут перерасти в тех же двух подозреваемых: конфликт блокировок или взаимоблокировки.
💡 Минимизируйте область блокировок, ограничив строки, на которые нацелены запросы UPDATE (предложения WHERE — ваши лучшие друзья). Пакетные обновления также могут помочь уменьшить конкуренцию.
Журналы транзакций
Базы данных ведут журналы транзакций для обеспечения согласованности и поддержки откатов. Хотя INSERTи UPDATE запись в журнал транзакций, UPDATE как правило, более многословна.
Это особенно актуально для баз данных, таких как PostgreSQL, которые используют Multi-Version Concurrency Control (MVCC) . Здесь UPDATE не перезаписывает существующую строку, а создает новую версию строки и помечает старую как «мертвую». Этот процесс обеспечивает согласованность и поддерживает параллельные чтения, но со временем может привести к фрагментации и потребовать регулярных VACUUM операций по освобождению хранилища.
Что сложнее?
Если вы добавляете новые строки с небольшим количеством индексов или без них и минимальными ограничениями, INSERT обычно это будет более простым вариантом. Обычно это проще и понятнее, когда данные свежие и таблица не сильно индексирована. Но как только в дело вступают индексы, триггеры и высокая степень параллелизма, INSERT это может начать нагружать ресурсы базы данных.
UPDATE, с другой стороны, часто требует большего от базы данных с самого начала. От поиска строк, обновления данных, управления индексами до блокировки ресурсов — это многоуровневый процесс, и каждый шаг может привести к узким местам производительности. При наличии нескольких индексов или большого объема транзакций UPDATE может стать дорогостоящей операцией как с точки зрения времени, так и производительности базы данных.
Подводя итоги
Выбор между INSERT и UPDATE во многом зависит от вашего варианта использования и структуры вашей базы данных. Например, если вы имеете дело с большими объемами обновлений, вы можете рассмотреть альтернативные стратегии, такие как вставка новой строки и удаление старой, вместо выполнения тяжелого обновления, особенно если обновления рискуют фрагментировать таблицу или повлиять на несколько индексов.
Операция UPDATE
При UPDATE изменяются уже существующие — и вот тут-то все становится сложнее. UPDATE Операции часто задействуют несколько подсистем в базе данных, что делает их ресурсоемкими.
Нахождение строк
Каждый UPDATE начинается с поиска. Механизм базы данных должен найти точные строки, которые соответствуют WHERE предложению.
Если WHERE предложение нацелено на индексированные столбцы, это может быть относительно эффективно. Однако, если запрос фильтрует неиндексированные столбцы, движку может потребоваться некоторое время для сканирования всей таблицы. На небольших наборах данных это управляемо, но по мере роста таблицы процесс поиска может стать мучительно медленным.
💡 Плохо оптимизированные запросы или отсутствующие индексы могут увеличить стоимость поиска строк, что значительно повлияет на производительность. Опять же, оптимизацию часто нужно выполнять в пространстве между монитором и креслом.
Индексированные столбцы
Хотя индексы отлично подходят для ускорения поиска, при их изменении они добавляют значительные накладные расходы. База данных должна не только обновить строку, но и пересмотреть каждый связанный индекс. Следовательно, обновление индексированных столбцов может быть медленным.
Для составных индексов сложность умножается. Обновление одного значения может привести к пересчету и изменению положения записи индекса. Чем больше индексов привязано к столбцу, тем больше времени база данных тратит на перетасовку данных, замедляя UPDATE.
Параллелизм
В отличие от относительно дружественных к параллелизму операций INSERT, UPDATE операции могут быть блокировочными. Чтобы обеспечить целостность данных, база данных часто блокирует обновляемые ею строки, не давая другим операциям изменять их одновременно. Для небольших таблиц с низким трафиком это нормально. Но в средах с высоким параллелизмом эти блокировки могут перерасти в тех же двух подозреваемых: конфликт блокировок или взаимоблокировки.
💡 Минимизируйте область блокировок, ограничив строки, на которые нацелены запросы UPDATE (предложения WHERE — ваши лучшие друзья). Пакетные обновления также могут помочь уменьшить конкуренцию.
Журналы транзакций
Базы данных ведут журналы транзакций для обеспечения согласованности и поддержки откатов. Хотя INSERTи UPDATE запись в журнал транзакций, UPDATE как правило, более многословна.
Это особенно актуально для баз данных, таких как PostgreSQL, которые используют Multi-Version Concurrency Control (MVCC) . Здесь UPDATE не перезаписывает существующую строку, а создает новую версию строки и помечает старую как «мертвую». Этот процесс обеспечивает согласованность и поддерживает параллельные чтения, но со временем может привести к фрагментации и потребовать регулярных VACUUM операций по освобождению хранилища.
Что сложнее?
Если вы добавляете новые строки с небольшим количеством индексов или без них и минимальными ограничениями, INSERT обычно это будет более простым вариантом. Обычно это проще и понятнее, когда данные свежие и таблица не сильно индексирована. Но как только в дело вступают индексы, триггеры и высокая степень параллелизма, INSERT это может начать нагружать ресурсы базы данных.
UPDATE, с другой стороны, часто требует большего от базы данных с самого начала. От поиска строк, обновления данных, управления индексами до блокировки ресурсов — это многоуровневый процесс, и каждый шаг может привести к узким местам производительности. При наличии нескольких индексов или большого объема транзакций UPDATE может стать дорогостоящей операцией как с точки зрения времени, так и производительности базы данных.
Подводя итоги
Выбор между INSERT и UPDATE во многом зависит от вашего варианта использования и структуры вашей базы данных. Например, если вы имеете дело с большими объемами обновлений, вы можете рассмотреть альтернативные стратегии, такие как вставка новой строки и удаление старой, вместо выполнения тяжелого обновления, особенно если обновления рискуют фрагментировать таблицу или повлиять на несколько индексов.
👍5🔥1👏1
Задача
Есть две таблицы из одного поля. В левой таблице table_1 - 4 строки, во всех null. В правой таблице table_2 - 10 строк, во всех также null.
Сколько строк вернет запрос из этих двух таблиц в результате соединений:
A - inner join
Б - left join
В - right join
Г - full join
Д - cross join
#задача
Есть две таблицы из одного поля. В левой таблице table_1 - 4 строки, во всех null. В правой таблице table_2 - 10 строк, во всех также null.
Сколько строк вернет запрос из этих двух таблиц в результате соединений:
A - inner join
Б - left join
В - right join
Г - full join
Д - cross join
#задача
🔥5👀3👍1
👍4🔥4❤1
Друзья, всем привет 👋. Врываемся в рабочую неделю! 🫠
Итак, давайте разберем результаты решения вот этой задачки.
Правильно ответили всего лишь 33%😳 . Возможно, варианты ответов были запутанные (я старался 🤝), но все-таки кто знает, как работают джоины решил бы легко. Думал будет больше правильных ответов.
Я попробую разжевать как решаются данные задачи🫡.
Пойдем поэтапно. Я сделал 3 схемы, скрин прикрепил. Внимательно изучите.
Дальше попробую объяснить текстом ( это сложновато, но попробую).
Объяснение:
1) Посмотрим, как соединяются строки с числами без null и без дублей. Здесь все легко.
• inner join – берем все что пересекается в двух таблицах, 2 и 3 есть в двух таблицах, значит берем 2 строки.
• left join – сразу берем все из левой таблицы (1,2,3) и ищем соответствия из правой (2, 3 соответствует), если в правой таблице нет равного значения ставим null.
• right join - наоборот, берем все из правой (2,3,4) , берем такие же значения из левой, если в левой таблице такого значения нет – ставим null.
• full join – как бы соединяем left и right, берем все из левой (1,2,3) и все из правой таблицы (2,3,4), если соответствий нет - ставим null. У 1 (единицы) из левой таблицы нет равного значения в правой, ставим null, у 4 (четверки) из правой таблицы, нет равного равного значения в левой - тоже ставим null.
• cross join. Запомните, при cross join-e всегда тупо все перемножаем. Без разницы равно или не равно. Проходимся по всем строкам в цикле. Берем 1 из левой таблицы, пробегаемся по всей правой ( (1,2), (1,3),(1,4)). Потом берем следующие строки..
2) Как соединятся строки с числа и с дублями, без null.
Что в этом случае будет отличаться. У нас здесь в левой таблице одна 2, а правой таблице две 2. Значит эти 2 (двойки) везде просто замножатся. Достаточно посмотреть на скрин.
3) Как соединяются null-ы (наша задачка)
Вот этот третий случай, на самом деле не очень простой (как и показал результат опроса). Его советую разок прям покрутить, создать таблицы и посмотреть, как выполняются соединения. Скрипты отправлю в комменты.
Здесь самое главное понять: Null не равно Null❗️ ‼️
То есть null = null вернет False. Null is Null вернет True, но в соединении стоит = (равно). Поэтому в результате соединения с null-ми у нас всегда будет ложь и никаких соответствий не будет. И тем более не будет дублей.
Разберем. В левой таблиц три null-a, в правой два null-a.
• inner join – берем только то, что пересекается. Null из левой таблице не равен Null из правой. В результате у нас ничто ничему не равно. Возвращается 0 строк.
• left join - берем все из левой таблицы, это три null-a. У нас нет соответствии из правой таблицы (null не равен null), и тут интересный момент – мы все равно ставим null из справой. Но это как бы Null не из правой таблицы, а null то есть нет соответствия. Это надо осознать🤔 . В рез-те возвращается 3 строки.
• right join – аналогично. Берем все из правой таблицы (два null-a), равных значений в левой таблице нет, значит ставим null. В рез-те возвращается 2 строки.
• full join – тоже сложновато представить. Мы берем все из левой таблицы (три null), равных значений в правой таблице – нет, значит ставим null. Далее также берем все из правой таблицы (два null), равных значений в левой таблице нет, ставим null. В результате возвращается 5 строк ( 3 из левой+ 2 из справой).
• cross join. Как писал ранее – тупо перемножаем. 3 null-a из левой * 2 null-a из правой таблицы = 6 строк со всеми null-ми. Нам без разницы равно что-то друг другу или нет, мы просто в цикле пробегаемся по все строкам.
Что касается, нашей задачки❗️ . Слева 4 строки с null-ми, справа 10 строк с null-ми.
• inner join ничего не вернет ( 0 строк).
• left join вернет 4 строки (все из левой)
• right join вернет 10 строк (все из правой).
• full join 4 + 10 = 14 строк, все из левой + все из правой, а пересечений нет (null != null).
• cross join, перемножаем, 4*10=40 строк.
Если остались вопросы, смело задавайте!
#sql #база #jun
Итак, давайте разберем результаты решения вот этой задачки.
Правильно ответили всего лишь 33%
Я попробую разжевать как решаются данные задачи🫡.
Пойдем поэтапно. Я сделал 3 схемы, скрин прикрепил. Внимательно изучите.
Дальше попробую объяснить текстом ( это сложновато, но попробую).
Объяснение:
1) Посмотрим, как соединяются строки с числами без null и без дублей. Здесь все легко.
• inner join – берем все что пересекается в двух таблицах, 2 и 3 есть в двух таблицах, значит берем 2 строки.
• left join – сразу берем все из левой таблицы (1,2,3) и ищем соответствия из правой (2, 3 соответствует), если в правой таблице нет равного значения ставим null.
• right join - наоборот, берем все из правой (2,3,4) , берем такие же значения из левой, если в левой таблице такого значения нет – ставим null.
• full join – как бы соединяем left и right, берем все из левой (1,2,3) и все из правой таблицы (2,3,4), если соответствий нет - ставим null. У 1 (единицы) из левой таблицы нет равного значения в правой, ставим null, у 4 (четверки) из правой таблицы, нет равного равного значения в левой - тоже ставим null.
• cross join. Запомните, при cross join-e всегда тупо все перемножаем. Без разницы равно или не равно. Проходимся по всем строкам в цикле. Берем 1 из левой таблицы, пробегаемся по всей правой ( (1,2), (1,3),(1,4)). Потом берем следующие строки..
2) Как соединятся строки с числа и с дублями, без null.
Что в этом случае будет отличаться. У нас здесь в левой таблице одна 2, а правой таблице две 2. Значит эти 2 (двойки) везде просто замножатся. Достаточно посмотреть на скрин.
3) Как соединяются null-ы (наша задачка)
Вот этот третий случай, на самом деле не очень простой (как и показал результат опроса). Его советую разок прям покрутить, создать таблицы и посмотреть, как выполняются соединения. Скрипты отправлю в комменты.
Здесь самое главное понять: Null не равно Null
То есть null = null вернет False. Null is Null вернет True, но в соединении стоит = (равно). Поэтому в результате соединения с null-ми у нас всегда будет ложь и никаких соответствий не будет. И тем более не будет дублей.
Разберем. В левой таблиц три null-a, в правой два null-a.
• inner join – берем только то, что пересекается. Null из левой таблице не равен Null из правой. В результате у нас ничто ничему не равно. Возвращается 0 строк.
• left join - берем все из левой таблицы, это три null-a. У нас нет соответствии из правой таблицы (null не равен null), и тут интересный момент – мы все равно ставим null из справой. Но это как бы Null не из правой таблицы, а null то есть нет соответствия. Это надо осознать
• right join – аналогично. Берем все из правой таблицы (два null-a), равных значений в левой таблице нет, значит ставим null. В рез-те возвращается 2 строки.
• full join – тоже сложновато представить. Мы берем все из левой таблицы (три null), равных значений в правой таблице – нет, значит ставим null. Далее также берем все из правой таблицы (два null), равных значений в левой таблице нет, ставим null. В результате возвращается 5 строк ( 3 из левой+ 2 из справой).
• cross join. Как писал ранее – тупо перемножаем. 3 null-a из левой * 2 null-a из правой таблицы = 6 строк со всеми null-ми. Нам без разницы равно что-то друг другу или нет, мы просто в цикле пробегаемся по все строкам.
Что касается, нашей задачки
• inner join ничего не вернет ( 0 строк).
• left join вернет 4 строки (все из левой)
• right join вернет 10 строк (все из правой).
• full join 4 + 10 = 14 строк, все из левой + все из правой, а пересечений нет (null != null).
• cross join, перемножаем, 4*10=40 строк.
Если остались вопросы, смело задавайте!
#sql #база #jun
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥11❤3👍3
no_zapret_it_penguin.7z
1008.9 KB
Привет, подписчики!😎
Вдруг еще кто-то не знает как обходить замедление ютуба на пк без vpn и всяких скамерских расширений, рассказываю:
Есть специальная приблуда, которой я пользуюсь с начала замедления ютуба и дискорда. Запускается батник (файлик) на винде, который, грубо говоря, не допускает срабатывания триггера запрета. Кому интересно, прочитаете про принцип работы на гите, там все подробно описано.
Этим обходом пользуются все мои коллеги. Вот ссылочка на git репу, скачивайте архив и запускайте файлик general (под админом) и все!
https://github.com/bol-van/zapret
* на всякий случай еще прикреплю архив
Дальше в планировщике заданий windows (открыть лучше под админом ) я создал задачу, которая запускает этот батник при входе винду. Cкрины задачи прикрепил в комментах (важно настроить запуск под админом).
И все просто работает, вы забываете про замедление ютуба, ресурсов никаких не тратится на этот обход, скама нет. Кому это было полезно, дайте знать. 😁
p.s. это не 1 апрельская шутка*
#полезные_инструменты
Вдруг еще кто-то не знает как обходить замедление ютуба на пк без vpn и всяких скамерских расширений, рассказываю:
Есть специальная приблуда, которой я пользуюсь с начала замедления ютуба и дискорда. Запускается батник (файлик) на винде, который, грубо говоря, не допускает срабатывания триггера запрета. Кому интересно, прочитаете про принцип работы на гите, там все подробно описано.
Этим обходом пользуются все мои коллеги. Вот ссылочка на git репу, скачивайте архив и запускайте файлик general (под админом) и все!
https://github.com/bol-van/zapret
* на всякий случай еще прикреплю архив
Дальше в планировщике заданий windows (открыть лучше под админом ) я создал задачу, которая запускает этот батник при входе винду. Cкрины задачи прикрепил в комментах (важно настроить запуск под админом).
И все просто работает, вы забываете про замедление ютуба, ресурсов никаких не тратится на этот обход, скама нет. Кому это было полезно, дайте знать. 😁
p.s. это не 1 апрельская шутка*
#полезные_инструменты
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍4❤1
Популярный вопрос с собеседований
data engineer/data analyst (lvl jun/mid)
*здесь база данных понимается не в общем смысле, а как БД под капотом у классического ПО и транзакционных приложений*
1. База данных (Database, DB) - это система для хранения и управления операционными данными, предназначенная для частых транзакций (добавление, изменение, удаление).
Назначение: Операционная обработка данных (OLTP).
Основные характеристики:
✔️ Оптимизирована для частых транзакций (добавление, изменение, удаление)
✔️ Текущие данные (актуальное состояние системы)
✔️ Нормализованная структура (минимум дублирования)
Примеры:
➖ PostgreSQL
➖ MySQL
➖ Oracle
Когда использовать?
➜ Когда нужна работа с актуальными данными в реальном времени (например, онлайн-платежи, заказы в интернет-магазине).
2. Хранилище данных (Data Warehouse, DWH) - это централизованное хранилище структурированных данных, оптимизированное для аналитики и отчетности. Оно собирает информацию из разных источников, очищает и преобразует её для удобного анализа.
Назначение: Аналитика и отчёты (OLAP).
Основные характеристики:
✔️ Структурированные данные (таблицы, схемы)
✔️ Оптимизировано для сложных аналитических запросов
✔️ Исторические данные (хранятся годами)
✔️ ETL-процессы (очистка и преобразование перед загрузкой)
✔️ Денормализованные схемы ("звезда", "снежинка")
Примеры:
➖ Snowflake
➖ Greenplum
➖ Oracle Exadata
Когда использовать?
➜ Когда нужна аналитика на структурированных данных (например, отчёты по продажам за 5 лет, BI-дашборды).
3. Озеро данных (Data Lake) - это хранилище сырых данных любого формата (структурированных, полуструктурированных, неструктурированных), без строгой схемы.
Назначение: Хранение сырых данных любого формата.
Основные характеристики:
✔️ Любые данные (структурированные, JSON, логи, видео, изображения)
✔️ Масштабируемость (Big Data: Hadoop, S3)
✔️ Используется для ML, AI и глубокого анализа, архивации больших данных на дешевом железе
Примеры:
➖ AWS S3 + Athena
➖ Hadoop HDFS
➖ Yandex Object Storage
Когда использовать?
➜ Когда нужно хранить разнородные данные для последующей обработки (например, логи сервера, данные IoT-устройств, архивы).
Еще раз 😁
🔹 Ключевые отличия 🔹
📌 База данных (DB)
▪️ Тип данных: Структурированные
▪️ Оптимизация: OLTP (транзакции)
▪️ Пример: Банковские транзакции
📌 Хранилище (DWH)
▪️ Тип данных: Структурированные
▪️ Оптимизация: OLAP (аналитика)
▪️ Пример: Анализ продаж за 5 лет
📌 Озеро данных (Data Lake)
▪️ Тип данных: Любые (структур./неструктур.)
▪️ Оптимизация: Хранение + гибкий анализ
▪️ Пример: Хранение логов сервера
Современные системы часто комбинируют подходы, например:
➖ Data Lakehouse (озеро + хранилище) – как в Delta Lake или Databricks.
➖ Гибридные DWH (поддержка полуструктурированных данных, как в Snowflake).
#Вопросы_с_собесов #архитектура
data engineer/data analyst (lvl jun/mid)
Что такое хранилище данных? Чем хранилище отличается от обычной Базы данных? Что такое озеро данных?
*здесь база данных понимается не в общем смысле, а как БД под капотом у классического ПО и транзакционных приложений*
1. База данных (Database, DB) - это система для хранения и управления операционными данными, предназначенная для частых транзакций (добавление, изменение, удаление).
Назначение: Операционная обработка данных (OLTP).
Основные характеристики:
✔️ Оптимизирована для частых транзакций (добавление, изменение, удаление)
✔️ Текущие данные (актуальное состояние системы)
✔️ Нормализованная структура (минимум дублирования)
Примеры:
Когда использовать?
➜ Когда нужна работа с актуальными данными в реальном времени (например, онлайн-платежи, заказы в интернет-магазине).
2. Хранилище данных (Data Warehouse, DWH) - это централизованное хранилище структурированных данных, оптимизированное для аналитики и отчетности. Оно собирает информацию из разных источников, очищает и преобразует её для удобного анализа.
Назначение: Аналитика и отчёты (OLAP).
Основные характеристики:
✔️ Структурированные данные (таблицы, схемы)
✔️ Оптимизировано для сложных аналитических запросов
✔️ Исторические данные (хранятся годами)
✔️ ETL-процессы (очистка и преобразование перед загрузкой)
✔️ Денормализованные схемы ("звезда", "снежинка")
Примеры:
Когда использовать?
➜ Когда нужна аналитика на структурированных данных (например, отчёты по продажам за 5 лет, BI-дашборды).
3. Озеро данных (Data Lake) - это хранилище сырых данных любого формата (структурированных, полуструктурированных, неструктурированных), без строгой схемы.
Назначение: Хранение сырых данных любого формата.
Основные характеристики:
✔️ Любые данные (структурированные, JSON, логи, видео, изображения)
✔️ Масштабируемость (Big Data: Hadoop, S3)
✔️ Используется для ML, AI и глубокого анализа, архивации больших данных на дешевом железе
Примеры:
Когда использовать?
➜ Когда нужно хранить разнородные данные для последующей обработки (например, логи сервера, данные IoT-устройств, архивы).
Еще раз 😁
🔹 Ключевые отличия 🔹
📌 База данных (DB)
▪️ Тип данных: Структурированные
▪️ Оптимизация: OLTP (транзакции)
▪️ Пример: Банковские транзакции
📌 Хранилище (DWH)
▪️ Тип данных: Структурированные
▪️ Оптимизация: OLAP (аналитика)
▪️ Пример: Анализ продаж за 5 лет
📌 Озеро данных (Data Lake)
▪️ Тип данных: Любые (структур./неструктур.)
▪️ Оптимизация: Хранение + гибкий анализ
▪️ Пример: Хранение логов сервера
Современные системы часто комбинируют подходы, например:
#Вопросы_с_собесов #архитектура
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4⚡2
Всем привет!🫡
Читал книгу Том Кайт "Oracle для профессионалов" (классика) и там был интересный момент про стандарты SQL:
Странно, вроде бы стандарты, а даже большие гиганты СУБД не полностью их поддерживают. Решил чуть разобраться в стандартизации и сделал для вас ( и для себя) небольшую выжимку. Если такое интересно, жду реакции😎
Читал книгу Том Кайт "Oracle для профессионалов" (классика) и там был интересный момент про стандарты SQL:
Ни один поставщик не подтверждает сертификатом "совместимость" своих баз
данных со стандартом SQL99 на основном или расширенном уровне. Более того,
я не знаю ни одного поставщика, который заявлял бы, что его продукт полностью
совместим со стандартом на любом из упомянутых уровней.
Странно, вроде бы стандарты, а даже большие гиганты СУБД не полностью их поддерживают. Решил чуть разобраться в стандартизации и сделал для вас ( и для себя) небольшую выжимку. Если такое интересно, жду реакции
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2🤔1
Стандартизация SQL
SQL — один из самых старых языков программирования, но мало кто знает, как он менялся за 40 лет. Сегодня разберём стандартизацию SQL.
История SQL берёт начало в 1974 году, когда в лабораториях IBM в рамках проекта System R началась разработка экспериментальной реляционной СУБД. Изначально язык носил название SEQUEL (Structured English Query Language), но потом слово «English» пропало из этого словосочетания, а аббревиатура приобрела тот вид, к которому мы давно уже привыкли.
Бурное развитие коммерческих реализаций SQL и появление множества диалектов могло привести к серьёзным проблемам совместимости. Однако процесс стандартизации начался своевременно - уже в 1982 году ANSI (Американский национальный институт стандартов) поручил своему комитету по базам данных разработать единую спецификацию реляционного языка запросов, что позволило сохранить целостность экосистемы.
Основные стандарты SQL
➖ SQL-86. Первый вариант стандарта, принятый институтом ANSI и одобренный ISO в 1987 году. Базовые операции: SELECT, INSERT, UPDATE, DELETE, CREATE TABLE.
➖ SQL-89. Незначительные доработки предыдущего стандарта.
➖ SQL-92. Существенные изменения. Уровень Entry Level. JOIN-синтаксис (INNER /LEFT /RIGHT JOIN), ALTER TABLE, ограничения (CHECK, FOREIGN KEY), подзапросы. Стандартизировал поведение NULL и агрегатные функции. Золотой стандарт до сих пор.
➖ SQL:1999. Добавлены: регулярные выражения, рекурсивные запросы, триггеры, процедурные расширения, нескалярные типы данных, ООП-возможности.
➖ SQL:2003. Расширения для XML, оконные функции (OLAP), MERGE (UPSERT-операция), генераторы последовательностей.
➖ SQL:2006. Улучшена работа с XML, интеграция SQL и XQuery в запросах.
➖ SQL:2008. Устранены неоднозначности SQL:2003. TRUNCATE TABLE, улучшенные оконные функции (OVER, PARTITION BY). Пагинация через FETCH FIRST n ROWS ONLY (аналог LIMIT).
➖ SQL:2011. Поддержка временных данных (PERIOD FOR), уточнение ACID-транзакций для распределенных систем.
➖ SQL:2016. Защита на уровне строк, JSON-функции (JSON_ARRAY, JSON_OBJECT), ROW PATTERN MATCHING (поиск шаблонов в данных), полиморфные табличные функции.
➖ SQL:2023. Операции над графами, ANY_VALUE(), поддержка шестнадцатеричных/двоичных литералов, GREATEST/LEAST - функции для выбора max/min из списка значений, улучшенный MERGE - контроль над конфликтами при вставке, улучшения JSON - новые операторы для работы с JSON.
Куда движется SQL?
Современные стандарты SQL развиваются в сторону гибридных моделей данных (JSON, графы, векторы для AI) и глубокой аналитики – в будущем появятся встроенные ML-функции и улучшенная обработка временных рядов. Упор делается на безопасность (динамическое маскирование, аудит) и производительность (оптимизация JOIN, распределённые транзакции).
Постепенно стираются границы между SQL и NoSQL: новые версии стандарта добавляют поддержку полуструктурированных данных. Главный тренд – универсальность: один язык для OLTP, OLAP и даже машинного обучения.
Ни одна СУБД не поддерживает стандарты SQL полностью — все они используют собственные расширения и модификации.
Зачем тогда нужны стандарты?
Стандарты SQL служат универсальным ориентиром, задающим общую логику языка и основные принципы работы с данными. Хотя ни одна СУБД не реализует стандарт полностью, именно благодаря ему разные системы сохраняют базовую совместимость - например, все понимают запросы SELECT, WHERE или JOIN. Это позволяет разработчикам легче осваивать новые СУБД и переносить знания между проектами.
Кроме того, стандарт выступает "дорожной картой" развития - новые функции (вроде работы с JSON или оконных функций) сначала появляются в спецификации, а затем постепенно внедряются производителями СУБД. Без единого стандарта различия между диалектами были бы гораздо более радикальными, что затруднило бы работу с базами данных.
#sql
SQL — один из самых старых языков программирования, но мало кто знает, как он менялся за 40 лет. Сегодня разберём стандартизацию SQL.
История SQL берёт начало в 1974 году, когда в лабораториях IBM в рамках проекта System R началась разработка экспериментальной реляционной СУБД. Изначально язык носил название SEQUEL (Structured English Query Language), но потом слово «English» пропало из этого словосочетания, а аббревиатура приобрела тот вид, к которому мы давно уже привыкли.
Бурное развитие коммерческих реализаций SQL и появление множества диалектов могло привести к серьёзным проблемам совместимости. Однако процесс стандартизации начался своевременно - уже в 1982 году ANSI (Американский национальный институт стандартов) поручил своему комитету по базам данных разработать единую спецификацию реляционного языка запросов, что позволило сохранить целостность экосистемы.
Основные стандарты SQL
Куда движется SQL?
Современные стандарты SQL развиваются в сторону гибридных моделей данных (JSON, графы, векторы для AI) и глубокой аналитики – в будущем появятся встроенные ML-функции и улучшенная обработка временных рядов. Упор делается на безопасность (динамическое маскирование, аудит) и производительность (оптимизация JOIN, распределённые транзакции).
Постепенно стираются границы между SQL и NoSQL: новые версии стандарта добавляют поддержку полуструктурированных данных. Главный тренд – универсальность: один язык для OLTP, OLAP и даже машинного обучения.
Ни одна СУБД не поддерживает стандарты SQL полностью — все они используют собственные расширения и модификации.
Зачем тогда нужны стандарты?
Стандарты SQL служат универсальным ориентиром, задающим общую логику языка и основные принципы работы с данными. Хотя ни одна СУБД не реализует стандарт полностью, именно благодаря ему разные системы сохраняют базовую совместимость - например, все понимают запросы SELECT, WHERE или JOIN. Это позволяет разработчикам легче осваивать новые СУБД и переносить знания между проектами.
Кроме того, стандарт выступает "дорожной картой" развития - новые функции (вроде работы с JSON или оконных функций) сначала появляются в спецификации, а затем постепенно внедряются производителями СУБД. Без единого стандарта различия между диалектами были бы гораздо более радикальными, что затруднило бы работу с базами данных.
#sql
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3🥴1🤓1