К слову о MySQL как основе интернета. У Uber больше 2 600 MySQL-кластеров в проде.
Недавно они перевели многие из них с классической схемы primary-replica на групповую репликацию на базе Paxos.
У них в блоге есть ещё и годные бенчмарки по этому переходу.
👉 @SQLPortal
Недавно они перевели многие из них с классической схемы primary-replica на групповую репликацию на базе Paxos.
У них в блоге есть ещё и годные бенчмарки по этому переходу.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Расширение Postgres contrib pg_prewarm. Это штука, которую можно повесить на рестарт, чтобы заранее загрузить данные в shared buffers, а не ждать, пока система сама подтянет их по мере использования.
Для таблиц:
Для индексов:
👉 @SQLPortal
Для таблиц:
SELECT pg_prewarm('users') AS users_heap_blocks_loaded;Для индексов:
SELECT pg_prewarm('users_pkey') AS users_index_blocks_loaded;Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3
У тебя есть таблица с более чем 50 миллионами строк.
Твой руководитель попросил запускать только тот запрос, который с наибольшей вероятностью выполнится быстрее. Исходя из двух запросов ниже, какой ты запустишь и почему?
Запрос 1
Запрос 2
👉 @SQLPortal
Твой руководитель попросил запускать только тот запрос, который с наибольшей вероятностью выполнится быстрее. Исходя из двух запросов ниже, какой ты запустишь и почему?
Запрос 1
SELECT * FROM customers c
WHERE c.id IN (
SELECT customer_id
FROM orders
WHERE order_date > '2024-01-01'
);
Запрос 2
SELECT * FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
AND o.order_date > '2024-01-01'
);
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Contrib-расширение Postgres pgcrypto.
👉 @SQLPortal
-- Шифруем данные с использованием секретного ключа
INSERT INTO payments (cc)
VALUES ( pgp_sym_encrypt('41....257', 'secret-key') );
-- Расшифровываем данные для чтения, используя тот же секретный ключ
SELECT pgp_sym_decrypt(cc, 'secret-key') AS decrypted_cc
FROM payments;
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
3 вида шардирования баз данных:
• Range-based — разбивает данные по диапазонам значений ключа
• Hash-based — выбирает шарду с помощью хеш-функции
• Tenant-based — каждому клиенту (тенанту) выделяется своя отдельная база
Пояснения:
Range-based sharding делит данные по диапазонам ключа (например: ID 1–1 000 — первая шарда, 1 001–2 000 — вторая).
Hash-based sharding использует хеш от ключа, чтобы определить, в какую шарду поместить или откуда прочитать запись. Это даёт более равномерное распределение.
Tenant-based sharding выделяет каждому клиенту собственную базу данных, что упрощает изоляцию, миграции и управление данными.
Просто, понятно и работает во всех масштабах.
👉 @SQLPortal
• Range-based — разбивает данные по диапазонам значений ключа
• Hash-based — выбирает шарду с помощью хеш-функции
• Tenant-based — каждому клиенту (тенанту) выделяется своя отдельная база
Пояснения:
Range-based sharding делит данные по диапазонам ключа (например: ID 1–1 000 — первая шарда, 1 001–2 000 — вторая).
Hash-based sharding использует хеш от ключа, чтобы определить, в какую шарду поместить или откуда прочитать запись. Это даёт более равномерное распределение.
Tenant-based sharding выделяет каждому клиенту собственную базу данных, что упрощает изоляцию, миграции и управление данными.
Просто, понятно и работает во всех масштабах.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Интерактивный гайд о шардировании баз данных, как это работает для реляционных баз.
Каждому инженеру стоит понимать базовые принципы и основные сложности шардирования. Эта статья как раз про это и предназначена.
Читаем здесь
👉 @SQLPortal
Каждому инженеру стоит понимать базовые принципы и основные сложности шардирования. Эта статья как раз про это и предназначена.
Читаем здесь
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Postgres использует архитектуру один процесс на одно подключение. Поэтому по возможности всегда стоит использовать пулер подключений.
Пулер подключений ставится между приложением и базой данных. Он держит пул открытых соединений и динамически сопоставляет входящие запросы с этими соединениями. Самый популярный инструмент для этого — PgBouncer, и у него есть три режима работы.
(1) Session pooling: каждое входящее подключение напрямую маппится на одно из соединений в пуле PgBouncer.
(2) Transaction pooling: каждая входящая транзакция получает соединение из пула и освобождает его после завершения транзакции.
(3) Statement pooling: каждый отдельный SQL-запрос маппится на соединение из пула. Многооператорные транзакции не поддерживаются. Самый ограниченный режим.
Вариант 1 не решает проблему высокой конкурентности в Postgres, поэтому обычно не рекомендуется для сценариев с большим числом одновременных подключений. Вариант 3 слишком ограничен, так как многооператорные транзакции важны для многих кейсов.
Вариант 2 - лучший баланс между поддержкой функциональности и контролем количества подключений к Postgres.
Режим statement это то, что мы используем в PlanetScale для всех своих инстансов PgBouncer.
👉 @SQLPortal
Пулер подключений ставится между приложением и базой данных. Он держит пул открытых соединений и динамически сопоставляет входящие запросы с этими соединениями. Самый популярный инструмент для этого — PgBouncer, и у него есть три режима работы.
(1) Session pooling: каждое входящее подключение напрямую маппится на одно из соединений в пуле PgBouncer.
(2) Transaction pooling: каждая входящая транзакция получает соединение из пула и освобождает его после завершения транзакции.
(3) Statement pooling: каждый отдельный SQL-запрос маппится на соединение из пула. Многооператорные транзакции не поддерживаются. Самый ограниченный режим.
Вариант 1 не решает проблему высокой конкурентности в Postgres, поэтому обычно не рекомендуется для сценариев с большим числом одновременных подключений. Вариант 3 слишком ограничен, так как многооператорные транзакции важны для многих кейсов.
Вариант 2 - лучший баланс между поддержкой функциональности и контролем количества подключений к Postgres.
Режим statement это то, что мы используем в PlanetScale для всех своих инстансов PgBouncer.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔1
Ключевые слова SQL не чувствительны к регистру, в отличие от Python.
Все запросы выше будут валидными. Но большинство разработчиков пишут ключевые слова в верхнем регистре, потому что это считается рекомендованным стилем.
Писать SQL-ключевые слова в верхнем регистре не является правилом, но это одна из тех привычек, которые отличают новичков от профессионалов.
SQL — декларативный язык. Когда ты быстро просматриваешь запрос, мозгу важно отличать то, что должна делать база данных (команды), от тех данных, к которым эти команды применяются. Выделение команд вроде SELECT, FROM, WHERE, GROUP BY и ORDER BY в верхнем регистре делает их сразу заметными. Это визуальная структура. Глаз сразу понимает, где ключевое слово, а где имя колонки или таблицы.
В итоге, заглавные ключевые слова в SQL используют ради ясности, читабельности, аккуратного стиля и удобства поддержки кода в долгой перспективе.
👉 @SQLPortal
Все запросы выше будут валидными. Но большинство разработчиков пишут ключевые слова в верхнем регистре, потому что это считается рекомендованным стилем.
Писать SQL-ключевые слова в верхнем регистре не является правилом, но это одна из тех привычек, которые отличают новичков от профессионалов.
SQL — декларативный язык. Когда ты быстро просматриваешь запрос, мозгу важно отличать то, что должна делать база данных (команды), от тех данных, к которым эти команды применяются. Выделение команд вроде SELECT, FROM, WHERE, GROUP BY и ORDER BY в верхнем регистре делает их сразу заметными. Это визуальная структура. Глаз сразу понимает, где ключевое слово, а где имя колонки или таблицы.
В итоге, заглавные ключевые слова в SQL используют ради ясности, читабельности, аккуратного стиля и удобства поддержки кода в долгой перспективе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5
AI-агенты могут помочь собрать схему и сгенерировать тестовые данные.
Крис Хойна делится примером промпта для хранения данных о машинах, грузовиках, мотоциклах и их производителях.
После этого онa показывает, как использовать этот промпт вместе с SQLcl MCP Server и Cline, чтобы создать таблицы.
👉 @SQLPortal
Крис Хойна делится примером промпта для хранения данных о машинах, грузовиках, мотоциклах и их производителях.
После этого онa показывает, как использовать этот промпт вместе с SQLcl MCP Server и Cline, чтобы создать таблицы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2💊1
Postgres 18: CREATE FOREIGN TABLE LIKE. Можно не тянуть схему удалённой таблицы и просто создать её дубликат по месту.
По сути, ты клонируешь структуру существующей таблицы через LIKE, включая значения по умолчанию и ограничения, и сразу привязываешь её к удалённой таблице через foreign server.
👉 @SQLPortal
CREATE FOREIGN TABLE sales (
LIKE archive_sales INCLUDING DEFAULTS INCLUDING CONSTRAINTS
)
SERVER archive
OPTIONS (schema_name 'public', table_name 'sales_24');
По сути, ты клонируешь структуру существующей таблицы через LIKE, включая значения по умолчанию и ограничения, и сразу привязываешь её к удалённой таблице через foreign server.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
SQL-Interview-Questions.pdf
1.2 MB
Подготовлен свежий сборник из 40 SQL-вопросов для технических собеседований. В него вошли все ключевые темы, которые обычно проверяют на позиции, связанные с базами данных
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤1
Доступ к атрибутам JSON, хранящимся в Oracle AI Database, можно организовать через простую точечную нотацию или через функции семейства JSON_VALUE.
Точечная нотация выглядит как <alias>.<column>.<path>.<to><attr> и позволяет обращаться к атрибутам прямо из SQL.
Аналогичный доступ можно оформить через JSON_VALUE(column, '$.<path>.<to><attr>'). Разница в том, что точечная нотация вернёт NULL, если не сможет обработать путь, а JSON_VALUE позволяет задавать поведение при ошибках и управлять типами возвращаемых данных.
JSON можно хранить в колонках VARCHAR2/CLOB/BLOB и проверять с помощью ограничения IS JSON. Для выборки подойдут как точечная нотация, так и JSON_VALUE, JSON_QUERY или JSON_TABLE.
Пример:
👉 @SQLPortal
Точечная нотация выглядит как <alias>.<column>.<path>.<to><attr> и позволяет обращаться к атрибутам прямо из SQL.
Аналогичный доступ можно оформить через JSON_VALUE(column, '$.<path>.<to><attr>'). Разница в том, что точечная нотация вернёт NULL, если не сможет обработать путь, а JSON_VALUE позволяет задавать поведение при ошибках и управлять типами возвращаемых данных.
JSON можно хранить в колонках VARCHAR2/CLOB/BLOB и проверять с помощью ограничения IS JSON. Для выборки подойдут как точечная нотация, так и JSON_VALUE, JSON_QUERY или JSON_TABLE.
Пример:
CREATE TABLE json_data ( data BLOB CHECK ( data IS JSON ) );
INSERT INTO json_data VALUES
( ' { array : [ 1, 2, 3 ], string : "text", date : "2023-01-01" }' );
SELECT j.data.array[0] string_number, -- по умолчанию varchar2(4000)
JSON_VALUE ( data, '$.array[2]' RETURNING NUMBER ) number_number,
JSON_VALUE ( data, '$.date' ) string_date,
JSON_VALUE ( data, '$.date' RETURNING NUMBER DEFAULT 0 ON ERROR ) not_number
FROM json_data j
WHERE j.data.string = 'text';
STRING_NUMBER NUMBER_NUMBER STRING_DATE NOT_NUMBER
-------------- -------------- ------------ ----------
1 3 2023-01-01 0
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2🔥1
Ты правда шаришь в SQL? 😊
Какой запрос вернёт накопительный итог продаж по дате?
A.
B.
C.
👉 @SQLPortal
Какой запрос вернёт накопительный итог продаж по дате?
A.
SELECT Date, SUM(Amount)
FROM Sales GROUP BY Date;
B.
SELECT Date, SUM(Amount) OVER (ORDER BY Date)
FROM Sales;
C.
SELECT Date, RUNNING(Amount) FROM Sales;
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Postgres 18 получил поддержку виртуальных вычисляемых колонок. Вычисляемые STORED-колонки в Postgres уже были несколько версий подряд.
Вычисляемые колонки позволяют:
• создавать колонку на основе других данных
• ссылаться на значения из других колонок
• заранее считать колляции или любые вычисления в базе, а не в приложении
Синтаксис GENERATED ALWAYS AS открывает выражение, а в конце указывается режим VIRTUAL или STORED.
Виртуальные вычисляемые колонки пересчитываются при каждом чтении, поэтому не подходят для тяжёлых вычислений. Для таких случаев лучше использовать STORED-колонку или даже expression index. Но они удобны, когда значение нужно редко и его логично вычислять на лету.
Пример:
👉 @SQLPortal
Вычисляемые колонки позволяют:
• создавать колонку на основе других данных
• ссылаться на значения из других колонок
• заранее считать колляции или любые вычисления в базе, а не в приложении
Синтаксис GENERATED ALWAYS AS открывает выражение, а в конце указывается режим VIRTUAL или STORED.
Виртуальные вычисляемые колонки пересчитываются при каждом чтении, поэтому не подходят для тяжёлых вычислений. Для таких случаев лучше использовать STORED-колонку или даже expression index. Но они удобны, когда значение нужно редко и его логично вычислять на лету.
Пример:
CREATE TABLE products (
id serial PRIMARY KEY,
price numeric,
tax_rate numeric DEFAULT 0.05,
total_price numeric GENERATED ALWAYS AS (price * (1 + tax_rate)) VIRTUAL
);
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍4
Изоляция рунета ближе, чем ты думаешь
Роскомнадзору дали карт-бланш на блокировки, а «белые списки» сайтов тестируют уже в десятках регионов. И гайки будут закручиваться только сильнее.
Чтобы в одночасье не лишиться доступа к свободному Интернету, просто сохрани Only Hack.
Тут профессиональный хакер делится фишками, с которыми доступ к глобальной сети у тебя будет даже в случае ядерного апокалипсиса.
Не жди момента «Х». Перестрахуйся подпиской.
Loading …
██████████████] 99%
Роскомнадзору дали карт-бланш на блокировки, а «белые списки» сайтов тестируют уже в десятках регионов. И гайки будут закручиваться только сильнее.
Чтобы в одночасье не лишиться доступа к свободному Интернету, просто сохрани Only Hack.
Тут профессиональный хакер делится фишками, с которыми доступ к глобальной сети у тебя будет даже в случае ядерного апокалипсиса.
Не жди момента «Х». Перестрахуйся подпиской.
💊4
Postgres 18 меняет дефолтные настройки целостности данных
В новом релизе опция data checksums теперь включена по умолчанию. Раньше админам нужно было явно передавать --data-checksums при initdb, иначе кластер поднимался без проверки страниц на тихую порчу. Теперь достаточно обычного initdb -D /data/pg18 — каждая 8KB-страница таблиц и индексов получает checksum, который проверяется при чтении. Это тот же механизм, на который опирается pgBackRest при валидации бэкапов.
При этом меняются и правила игры для апгрейдов через pg_upgrade: старый и новый кластеры должны быть подняты с одинаковыми настройками checksums. Если ваш текущий кластер без checksums, прямой апгрейд на «дефолтный» Postgres 18 провалится. Временный обходной путь — инициализировать новый кластер с флагом --no-data-checksums, чтобы выровнять конфигурацию. Более правильная стратегия будет, заранее включить checksums с помощью pg_checksums (да, с даунтаймом), а в больших инсталляциях сначала включать их на реплике и переключаться уже на неё.
В итоге checksums из рекомендованной опции превращаются в норму по умолчанию. Если вы до сих пор жили без них, самое время заложить в план обслуживания включение checksums и пересмотреть сценарии major-апгрейдов Postgres.
👉 @SQLPortal
В новом релизе опция data checksums теперь включена по умолчанию. Раньше админам нужно было явно передавать --data-checksums при initdb, иначе кластер поднимался без проверки страниц на тихую порчу. Теперь достаточно обычного initdb -D /data/pg18 — каждая 8KB-страница таблиц и индексов получает checksum, который проверяется при чтении. Это тот же механизм, на который опирается pgBackRest при валидации бэкапов.
При этом меняются и правила игры для апгрейдов через pg_upgrade: старый и новый кластеры должны быть подняты с одинаковыми настройками checksums. Если ваш текущий кластер без checksums, прямой апгрейд на «дефолтный» Postgres 18 провалится. Временный обходной путь — инициализировать новый кластер с флагом --no-data-checksums, чтобы выровнять конфигурацию. Более правильная стратегия будет, заранее включить checksums с помощью pg_checksums (да, с даунтаймом), а в больших инсталляциях сначала включать их на реплике и переключаться уже на неё.
В итоге checksums из рекомендованной опции превращаются в норму по умолчанию. Если вы до сих пор жили без них, самое время заложить в план обслуживания включение checksums и пересмотреть сценарии major-апгрейдов Postgres.
Please open Telegram to view this post
VIEW IN TELEGRAM
Crunchy Data
Postgres 18 New Default for Data Checksums and How to Deal with Upgrades | Crunchy Data Blog
Postgres 18 defaults to checksums on. This is a good feature for data integrity but might catch you off guard with an upgrade.
👍1
Работаешь с массивами? Оператор ANY позволяет проверить список и увидеть, совпадает ли хоть один элемент.
color = 'red' срабатывает только для одиночного значения
'Red' = ANY(...) работает, когда у тебя колонка со списком вроде ['red', 'blue', 'green']
👉 @SQLPortal
SELECT * FROM products
WHERE 'Red' = ANY(colors);
color = 'red' срабатывает только для одиночного значения
'Red' = ANY(...) работает, когда у тебя колонка со списком вроде ['red', 'blue', 'green']
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2