Сверхбыстрая и легкая база данных внутрипроцессной памятм, написанная на языке F#, поддерживающая: транзакции, вторичные индексы, персистентные структуры данных и инструменты управления памятью.
StereoDB поддерживает создание Stateful Services (API или ETL Worker), которые хранят все данные в памяти и могут обеспечить миллионы запросов в секунду для RPS с одного узла.
• Github
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤2🔥1
Использование рекурсивных запросов для управления иерархиями данных
Некоторые таблицы в SQL могут иметь неявный вид иерархии данных. Например, в нашей таблице сотрудников для каждого сотрудника имеется идентификатор
При такой организации мы можем иметь иерархию различных уровней. В каждой строке столбец
В этом запросе мы создали рекурсивный CTE под названием
Есть два подзапроса, соединенных между собой
@sqlhub
Некоторые таблицы в SQL могут иметь неявный вид иерархии данных. Например, в нашей таблице сотрудников для каждого сотрудника имеется идентификатор
manager_id
. У нас есть менеджер, который отвечает за других менеджеров, которые, в свою очередь, отвечают за других сотрудников, и так далее.При такой организации мы можем иметь иерархию различных уровней. В каждой строке столбец
manager_id
относится к строке, находящейся на непосредственном верхнем уровне иерархии. В таких случаях хорошим запросом является получение списка всех сотрудников, подчиняющихся генеральному директору компании (который в данном случае имеет идентификатор employee_id
, равный 110
). Для этого используем следующий запросWITH RECURSIVE subordinate AS (
SELECT
employee_id,
first_name,
last_name,
manager_id
FROM employee
WHERE employee_id = 110 -- id of the top hierarchy employee (CEO)
UNION ALL
SELECT
e.employee_id,
e.first_name,
e.last_name,
e.manager_id
FROM employee e
JOIN subordinate s
ON e.manager_id = s.employee_id
)
SELECT
employee_id,
first_name,
last_name,
manager_id
FROM subordinate ;
В этом запросе мы создали рекурсивный CTE под названием
subordinate
. Он является ключевой частью запроса, поскольку проходит по иерархии данных, переходя от одной строки к строкам иерархии, расположенным непосредственно под ней.Есть два подзапроса, соединенных между собой
UNION ALL;
первый подзапрос возвращает верхнюю строку иерархии, а второй запрос возвращает следующий уровень, добавляя эти строки к промежуточному результату запроса. Затем снова выполняется второй подзапрос, возвращающий следующий уровень, который снова добавляется к промежуточному результату. Этот процесс повторяется до тех пор, пока в промежуточный результат не будет добавлено ни одной новой строки. Наконец, главный запрос возвращает данные в том виде, в котором мы ожидаем.@sqlhub
👍19🔥3❤2
WITH employee_ranking AS (
SELECT
employee_id,
last_name,
first_name,
salary,
RANK() OVER (ORDER BY salary DESC) as ranking
FROM employee
)
SELECT
employee_id,
last_name,
first_name,
salary
FROM employee_ranking
WHERE ranking = 2
Условие WHERE ranking = 2 используется для фильтрации строк второй по величине зарплаты. Обратите внимание, что на позиции 2 может находиться более одного сотрудника, если у них одинаковая зарплата.
На данном этапе важно понять поведение функции RANK(), а также других доступных функций, таких как ROW_NUMBER() и DENSE_RANK(). Эта тема подробно рассматривается в статье - "Обзор функций ранжирования в SQL". Я рекомендую прочитать эту статью, если вам придется работать с различными видами ранжирования.
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤6🔥4
Сегодня вышла новая версию ElectricSQL.
ElectricSQL - это опенсорс платформа для локальной разработки, позволяющая легко создавать высококачественные современные приложения с мгновенной реактивностью, многопользовательской совместной работой в реальном времени и бесконфликтной поддержкой автономной работы.
Local-first - это новая парадигма разработки, при которой код приложения напрямую обращается к встроенной локальной базе данных, а данные синхронизируются в фоновом режиме посредством активной репликации базы данных. Поскольку код приложения обращается непосредственно к локальной базе данных, приложения работают мгновенно. Данные синхронизируются в фоновом режиме с помощью активной репликации.
• Github
• Документация
@Sqlhub
ElectricSQL - это опенсорс платформа для локальной разработки, позволяющая легко создавать высококачественные современные приложения с мгновенной реактивностью, многопользовательской совместной работой в реальном времени и бесконфликтной поддержкой автономной работы.
Local-first - это новая парадигма разработки, при которой код приложения напрямую обращается к встроенной локальной базе данных, а данные синхронизируются в фоновом режиме посредством активной репликации базы данных. Поскольку код приложения обращается непосредственно к локальной базе данных, приложения работают мгновенно. Данные синхронизируются в фоновом режиме с помощью активной репликации.
• Github
• Документация
@Sqlhub
👍11❤3🔥1
Уроки по T-SQL
1. Быстро и подробно об основах реляционных баз данных
2. Знакомимся с основными понятиями Transact SQL
3. Работа с временными таблицами: CREATE TABLE, DROPE TABLE, ALTER TABLE
4. Быстрый разбор выборки данных в T-SQL
5. Внесение изменений в базу данных T-SQL
6. Оператор Union за 5 мин T-SQL
7. Оператор CASE за 2 мин T-SQL
#video #sql
📌Видео
@Sqlhub
1. Быстро и подробно об основах реляционных баз данных
2. Знакомимся с основными понятиями Transact SQL
3. Работа с временными таблицами: CREATE TABLE, DROPE TABLE, ALTER TABLE
4. Быстрый разбор выборки данных в T-SQL
5. Внесение изменений в базу данных T-SQL
6. Оператор Union за 5 мин T-SQL
7. Оператор CASE за 2 мин T-SQL
#video #sql
📌Видео
@Sqlhub
👍4🔥4❤1
sqlparse.pdf
187.2 KB
Sqlparse: парсинг SQL-операторов
Sqlparse - это невалидирующий парсер SQL для Python. Он обеспечивает поддержку разбора, разбиения и форматирования SQL-операторов.
📌 Файл с примерам кода и документацией по работе в закрепе.
@sqlhub
Sqlparse - это невалидирующий парсер SQL для Python. Он обеспечивает поддержку разбора, разбиения и форматирования SQL-операторов.
$ pip install sqlparse
import sqlparse
📌 Файл с примерам кода и документацией по работе в закрепе.
raw = 'select * from foo; select * from bar;'
statements = sqlparse.split(raw)
statements
['select * from foo;', 'select * from bar;']
first = statements[0]
print(sqlparse.format(first, reindent=True, keyword_case='upper'))
SELECT *
FROM foo;
>>> # Parsing a SQL statement:
parsed = sqlparse.parse('select * from foo')[0]
parsed.tokens
[<DML 'select' at 0x7f22c5e15368>, <Whitespace ' ' at 0x7f22c5e153b0>, <Wildcard '*' … ]
@sqlhub
👍7🔥2❤1
PRQL - это современный язык для преобразования данных, который меняет обращение к базе данных на логически выстроенный
пайплайн
(конвейер). Как и SQL, он легко читается, является явным и декларативным. Но в отличие от SQL, он формирует логический
пайплайн
преобразований и поддерживает такие абстракции, как переменные и функции. Он может использоваться с любой базой данных, использующей SQL.from tracks
filter artist == "Bob Marley" # Each line transforms the previous result
aggregate { # `aggregate` reduces each column to a value
plays = sum plays,
longest = max length,
shortest = min length, # Trailing commas are allowed
}
• Github
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥5❤2
🔥 Дайджест полезных материалов из мира SQL за неделю
Почитать:
— Небольшой тест нескольких БД при работе с многими таблицами
— Визуализация распределений вероятностей в Python.
— 15 лучших бесплатных курсов по Linux
— Погружаемся в базы данных и SQL: полезные материалы и инструменты от сотрудников Selectel
— Optimizing SQL Performance with Execution Plans
— Data Analysis with SQL
— Dominando la Preparación de Datos para Análisis: Funciones y Técnicas Esenciales
— Autoscout24 SQL Analysis
— SQL Pro tips : Oracle SQL CROSS JOIN with UNPIVOT
— SQL Pro tips : Oracle XE Quick Start
— Leveraging Apache Age for Advanced Data Analytics
— Choosing an OLAP Engine for Financial Risk Management: What to Consider?
— SQL Window Functions
— Parallels and MSSQL Server
Посмотреть:
🌐 Django начало работы. (⏱ 08:18)
🌐 Go - SQL Databases in Golang with the database/sql package
🌐 Популярная задача с собеседования в Яндекс #python #задача #программирование #собеседование (⏱ 01:00)
🌐 Новые функции в IOS 17 (⏱ 00:29)
🌐 TokenFlow редактирование видео с помощью текстового описания (⏱ 00:22)
🌐 Парсер телеграм каналов на Python. Гайд по написанию мощного бота. (⏱ 11:58)
🌐 Задача из Собеседования в Яндекс с зарплатой 85000 рублей #python #собеседование #задача #yandex (⏱ 00:59)
🌐 Асинхронный парсинг сайтов на Python (⏱ 22:06)
Хорошего дня!
@sqlhub
Почитать:
— Небольшой тест нескольких БД при работе с многими таблицами
— Визуализация распределений вероятностей в Python.
— 15 лучших бесплатных курсов по Linux
— Погружаемся в базы данных и SQL: полезные материалы и инструменты от сотрудников Selectel
— Optimizing SQL Performance with Execution Plans
— Data Analysis with SQL
— Dominando la Preparación de Datos para Análisis: Funciones y Técnicas Esenciales
— Autoscout24 SQL Analysis
— SQL Pro tips : Oracle SQL CROSS JOIN with UNPIVOT
— SQL Pro tips : Oracle XE Quick Start
— Leveraging Apache Age for Advanced Data Analytics
— Choosing an OLAP Engine for Financial Risk Management: What to Consider?
— SQL Window Functions
— Parallels and MSSQL Server
Посмотреть:
🌐 Django начало работы. (⏱ 08:18)
🌐 Go - SQL Databases in Golang with the database/sql package
🌐 Популярная задача с собеседования в Яндекс #python #задача #программирование #собеседование (⏱ 01:00)
🌐 Новые функции в IOS 17 (⏱ 00:29)
🌐 TokenFlow редактирование видео с помощью текстового описания (⏱ 00:22)
🌐 Парсер телеграм каналов на Python. Гайд по написанию мощного бота. (⏱ 11:58)
🌐 Задача из Собеседования в Яндекс с зарплатой 85000 рублей #python #собеседование #задача #yandex (⏱ 00:59)
🌐 Асинхронный парсинг сайтов на Python (⏱ 22:06)
Хорошего дня!
@sqlhub
👍6🔥2❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53🔥15❤4
🐍Как Snowflake повышает эффективность dbt-моделей на Python
dbt — это инструмент, помогающий управлять всеми трансформациями данных, которые выполняются в базах данных с использованием SQL.
Допустим, у вас есть таблица с общим числом клиентских заказов, и нужно подсчитать, сколько из них пришлось на праздничные дни. Выполнить эту задачу можно с помощью двух SQL-запросов.
1. Добавить столбец is_holiday в таблицу sf100_orders, объединив ее с all_holidays. Назвать полученную таблицу sf100_orders_annotated.
2. Подсчитать строки, для которых is_holiday=true в таблице sf100_orders_annotated.
Эти два шага объединяют исходные данные, визуализированные с помощью dbt: в изображении.
Производный граф: из двух исходных таблиц составляется таблица count_holidays
Используя dbt, можно записать эти две трансформации в виде “dbt-моделей”, которые представляют собой файлы, содержащие SQL и некоторую конфигурацию dbt (при необходимости):
Эти два файла выглядят как типичный SQL, но с некоторым отличием. Вместо ссылок на таблицы dbt позволяет ссылаться на другие “модели” с помощью аннотаций {{ref(‘sf100_orders_annotated’)}}. Таким образом, dbt определяет связь и зависимости между всеми трансформациями, через которые проходят данные.
📌 Продолжение
@sqlhub
dbt — это инструмент, помогающий управлять всеми трансформациями данных, которые выполняются в базах данных с использованием SQL.
Допустим, у вас есть таблица с общим числом клиентских заказов, и нужно подсчитать, сколько из них пришлось на праздничные дни. Выполнить эту задачу можно с помощью двух SQL-запросов.
1. Добавить столбец is_holiday в таблицу sf100_orders, объединив ее с all_holidays. Назвать полученную таблицу sf100_orders_annotated.
2. Подсчитать строки, для которых is_holiday=true в таблице sf100_orders_annotated.
Эти два шага объединяют исходные данные, визуализированные с помощью dbt: в изображении.
Производный граф: из двух исходных таблиц составляется таблица count_holidays
Используя dbt, можно записать эти две трансформации в виде “dbt-моделей”, которые представляют собой файлы, содержащие SQL и некоторую конфигурацию dbt (при необходимости):
-- sf100_orders_annotated.sql
{{ config(materialized='table') }}
select a.*, b.date is not null is_holiday
from {{ref('sf100_orders')}} a
left join {{ref('all_holidays')}} b
on a.o_orderdate = b.date
-- count_holidays.sql
{{config(materialized='table')}}
select count(*) total_days
, count_if(is_holiday) holiday_count
, holiday_count/total_days ratio
from {{ref('sf100_orders_annotated')}}
Эти два файла выглядят как типичный SQL, но с некоторым отличием. Вместо ссылок на таблицы dbt позволяет ссылаться на другие “модели” с помощью аннотаций {{ref(‘sf100_orders_annotated’)}}. Таким образом, dbt определяет связь и зависимости между всеми трансформациями, через которые проходят данные.
📌 Продолжение
@sqlhub
👍6❤4🔥1
Greenplum — это open source MPP СУБД, основанная на PostgreSQL.
Архитектура СУБД укрупненно представляет собой систему, состоящую из n-го количества Segment Host — процессов/серверов, на которых производится хранение и обработка данных, и одного Master Host – процесса/сервера, являющегося точкой входа клиента, который также хранит внутри себя метаданные таблиц и распределяет обработку данных между сегментами.
Вопрос выбора способа хранения данных для меня встал достаточно остро из-за относительно большого объема анализируемых данных. Кратко опишу набор таблиц витрины и примерное количество строк в них на данный момент:
1. Таблица с пользователями маркетплейса (более 4 млн.);
2. Корзина товаров (более 150 млн.);
3. Покупки пользователей в маркетплейсе (более 40 млн.);
4. Таблица с начислениями бонусов за покупки (более 20 млн.)
5. И т.д. (суммарно еще около 5-10 млн. строк уходят на перечень продаваемых товаров, различные справочники и другую сопутствующую информацию)
Аналитические запросы, в особенности с объединением этих таблиц, занимают достаточно большое количество времени и ресурсов, что негативно складывается на работе СУБД, коллег и меня в частности.
В связи с этим, оптимизация хранения таблиц является одним из основных вариантов оптимизации запросов (вкупе с объяснением того, как эти оптимальные запросы строить, но это уже совсем другая история).
Рассмотрим задачу выбора оптимального способа хранения данных подробнее.
Читать
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍6🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
В данном примере запрос должен просканировать
8
отдельных файлов, чтобы найти строки, в которых id = 5.
Однако при оптимизации Z Order запрос должен просканировать только один файл, чтобы найти нужные строки.• Delta Lake Z Order
• Что такое Delta Lake
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥7👎3❤1
В SQL-джойнах скрыто больше, чем можно подумать. Давайте разберем их.
Будем использовать две простые таблицы: компании companies и их вакансии
jobs
.Есть три вымышленные компании —
Hoogle, Emazon и Neta
— которые предлагают на удивление мало вакансий:Hoogle
интересуется аналитиками данных. Emazon
нанимает Go-разработчиков и ML-инженеров. У Neta нет вакансий. А какая-то ноунейм-компания с идентификатором 99 отчаянно разыскивает UI-дизайнера.Время джойнить!
📌 Читать
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4❤3
🔥 Дайджест полезных материалов из мира SQL за неделю
Почитать:
— Регулярные выражения в реальных задачах
— О Prepare statements, серверном кэше скомпилированных запросов или как эффективно кэшировать запросы в YDB
— Exploring Database Options for Java Applications
— Fearless Multitenancy
— User-Defined Functions in SQL: Expanding Your Database Toolkit
— SQL Pro tips : AWS Athena SQL UNPIVOT : CROSS JOIN UNNEST
— SQL Pro tips : GCP BigQuery SQL CROSS JOIN with UNPIVOT UNNEST
— Exploring String Field Types in Databases: CHAR, VARCHAR, and TEXT
— PostgreSQL Internals: A Deep Dive into the Inner Workings of a Powerful Relational Database
— SQL - Optimize Your SQL Queries for Performance
— SQL - Use Indexes Wisely for Performance Optimization
— Performing SQL Commands
Посмотреть:
🌐 Разбор задачи с собеседования Data Science. Подготовка на практике (⏱ 26:12)
🌐 Cобеседование #Python топовый банк Goldman Sachs Associate на 12000 $ #задача #программирование (⏱ 01:00)
🌐 Facebook задача с собеседования на #Python на 120000 рублей #программирование #задача #код (⏱ 00:59)
🌐 Разбора задачи с собеседования #Golang (⏱ 00:22)
🌐 Django создание модели. Вывод даных на страницу (⏱ 13:01)
Хорошего дня!
Почитать:
— Регулярные выражения в реальных задачах
— О Prepare statements, серверном кэше скомпилированных запросов или как эффективно кэшировать запросы в YDB
— Exploring Database Options for Java Applications
— Fearless Multitenancy
— User-Defined Functions in SQL: Expanding Your Database Toolkit
— SQL Pro tips : AWS Athena SQL UNPIVOT : CROSS JOIN UNNEST
— SQL Pro tips : GCP BigQuery SQL CROSS JOIN with UNPIVOT UNNEST
— Exploring String Field Types in Databases: CHAR, VARCHAR, and TEXT
— PostgreSQL Internals: A Deep Dive into the Inner Workings of a Powerful Relational Database
— SQL - Optimize Your SQL Queries for Performance
— SQL - Use Indexes Wisely for Performance Optimization
— Performing SQL Commands
Посмотреть:
🌐 Разбор задачи с собеседования Data Science. Подготовка на практике (⏱ 26:12)
🌐 Cобеседование #Python топовый банк Goldman Sachs Associate на 12000 $ #задача #программирование (⏱ 01:00)
🌐 Facebook задача с собеседования на #Python на 120000 рублей #программирование #задача #код (⏱ 00:59)
🌐 Разбора задачи с собеседования #Golang (⏱ 00:22)
🌐 Django создание модели. Вывод даных на страницу (⏱ 13:01)
Хорошего дня!
👍9🔥3❤1
This media is not supported in your browser
VIEW IN TELEGRAM
В Oracle Database используйте:
CREATE TABLE ... ( <col> <datatype> DEFAULT ON NULL <expr> )
Если при
INSERT
опустить <col>
или поместить в него NULL
, то база данных использует вместо него <expr>
по умолчанию.#sql #tips #junior
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🥰3❤2🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥5❤3