Skip to content

Предложение VALUES или создание таблиц из ничего

Автор: Joe Celko, The VALUES clause or building tables out of nothing


Предложение VALUES, вероятно, одна из самых неправильно используемых возможностей в SQL. Если вы посмотрите на онлайн-форумы по SQL, вы увидите, что люди используют его как второе предложение в операторе вставки, но используют его для построения только одной строки за раз, например так:



BEGIN
INSERT INTO Zodiac (astro_sign, astro_start_date, astro_end_date)
VALUES ('Aries', '2025-03-21', '2025-04-19');
INSERT INTO Zodiac (astro_sign, astro_start_date, astro_end_date)
VALUES ('Taurus', '2025-04-20', '2025-05-20');

INSERT INTO Zodiac (astro_sign, astro_start_date, astro_end_date)
VALUES ('Pisces', '2023-05-19', '2026-03-20');
END;


Каждый оператор вставки заканчивается точкой с запятой, поэтому они будут выполняться отдельно и в представленном порядке. Оптимизатор не осмеливается их объединять, потому что может быть прямая ссылка на предыдущие вставки.



Я думаю, люди пишут такой код, потому что именно так вы бы читали перфокарты. Каждая карта поступает в устройство чтения карт, буферизуется и записывается в порядке поступления на магнитную ленту или дисковый файл. Добро пожаловать в 1960-е! Перестаньте подражать старым языкам программирования, таким как FORTRAN или BASIC, в которых были операторы WRITE, помещающие по одной записи за раз в файл. Начните думать о работе с целыми множествами.

Continue reading "Предложение VALUES или создание таблиц из ничего"

Повышение производительности PostgreSQL: пошаговое руководство по использованию pg_hint_plan

Пересказ статьи Matheus dos Santos. Mastering PostgreSQL Performance: A Step-by-Step Guide to pg_hint_plan


Планировщик запросов PostgreSQL - это сложный инженерный механизм, обычно принимающий блестящие решения относительно того, как выполнять ваши запросы. Однако в сложных сценариях или при необычных распределениях данных вы можете знать лучший способ. Именно в таких ситуациях на помощь приходит pg_hint_plan - мощное расширение, которое позволяет вам руководить, или "советовать", планировщиком для выбора специфичного пути выполнения.

Это руководство проведет вас через весь процесс, начиная с установки pg_hint_plan из источника до использования его, чтобы принудительно выполнить сканирование индекса на большом наборе данных, демонстрируя возможности непосредственного управления производительностью вашего запроса.
Continue reading "Повышение производительности PostgreSQL: пошаговое руководство по использованию pg_hint_plan"

Настройка производительности в Oracle: практические методы, которыми должен владеть каждый DBA

Пересказ статьи Udaya Veeramreddygari. Oracle Performance Tuning: Practical Techniques Every DBA Should Master


Как специалисты по базам данных, мы все сталкивались с этим ужасным моментом, когда пользователи начинают жаловаться на медленные запросы, и внезапно все смотрят на вас с выражением «исправьте это сейчас же». Настройка производительности Oracle может показаться невероятно сложной, особенно в условиях стресса, но хорошая новость состоит в том, что большинство проблем с производительностью возникают по нескольким распространённым причинам. Позвольте мне рассказать вам о нескольких проверенных методах, которые спасали мне жизнь больше раз, чем я могу сосчитать.

Начнем с самого простого: статистика и планы выполнения


Прежде чем перейти с сложным стратегиям настройки, всегда проверяйте актуальность вашей статистики. Оптимизатор Oracle на основе стоимости всецело опирается на точность статистики для принятия умных решений относительно путей выполнения запросов. Мне приходилось видеть запросы, которые выполнялись в 10 раз медленнее только потому, что кто-то забыл обновить статистику после загрузки большого объема данных. Continue reading "Настройка производительности в Oracle: практические методы, которыми должен владеть каждый DBA"

Сравнение перестройки и реорганизации индексов SQL

Пересказ статьи Sergey Gigoyan. SQL Index Rebuild vs Reorganize Comparison


При модификации данных в базе данных SQL соответствующие индексы тоже изменяются. Эти изменения приводят к фрагментации индексов. Фрагментация означает, что логический порядок данных на страницах индекса не соответствует физическому порядку. Во фрагментированных индексах информация не располагается логически, что делает операции извлечения данных из индекса более затратными по времени, это приводит к проблемам производительности запросов. Таким образом, фрагментацию индексов следует периодически устранять для поддержания высокой производительности. Операции перестройки и реорганизации индекса как раз направлены на дефрагментацию индексов.

В данной статье мы рассмотрим то, что является общим и различным в этих операциях. Прежде чем начать, мы объясним некоторые важные связанные с ними понятия. В частности, ту информацию, которая стоит за коэффициентом заполнения и статистикой, т.к. эти понятия упоминаются при обсуждении операций по перестроению и реорганизации индекса.

Continue reading "Сравнение перестройки и реорганизации индексов SQL"

Параметры привязки ускоряют выполнение SQL-запросов

Пересказ статьи Lorenzo Uriel. Bind Parameters Make Your SQL Queries Faster




Конечно, вы уже использовали параметры привязки, но слышали ли вы такой совет для оптимизации?

Что-то типа: "Использование параметров привязки (параметризованных запросов) вместо конкатенации строки SQL улучшит производительность SQL"?

Почему это так вы поймете из этой статьи.

Continue reading "Параметры привязки ускоряют выполнение SQL-запросов"

Кэширование результата запроса для быстрых приложений баз данных

Пересказ статьи Christopher Jones. Query result caching for fast database applications


Встроенный в базы данных Oracle “Client Result Cache” (CRC) является эффективным, интегрированным, управляемым кэшем, который резко улучшает производительность запросов и существенно снижает нагрузку на базу данных при повторяющихся запросах к по большей части статическим таблицам, таким как почтовые индексы или номера деталей. Никакие изменения в приложениях не требуются. Никакого отдельное промежуточного кэша устанавливать не нужно. CRC доступен для каждого "толстого" клиента, который использует библиотеки Oracle Client, такие как драйверы для Python, Node.js, Go, PHP, Rust, Ruby и Oracle C API. Он также доступен в JDBC. Эта статья демонстрирует пример для Python.

Преимущества кэширования результатов клиента


  • Может использоваться без необходимости изменять код приложения.

  • Улучшенное время отклика запроса.

  • Операторы не посылаются для выполнения в базу данных.

  • Лучшая производительность за счет устранения циклов обмена между серверами.

  • Улучшенная масштабируемость сервера баз данных за счет экономии ресурсов сервера.

  • Автоматически управляемое аннулирование кэша, поддерживающее соответствие кэша изменениям в базе данных.

  • Не требуется сервер промежуточного слоя для кэширования.

  • Разработчикам не требуется создавать или использовать собственный кэш.
Continue reading "Кэширование результата запроса для быстрых приложений баз данных"

Обзор индексов в MySQL: составные индексы B-Tree

Пересказ статьи Lukas Vileikis. MySQL Index Overviews: Composite B-Tree Indexes


Индексы в MySQL являются одним из главных средств улучшения производительности запросов. Они особенно полезны, когда основные операции вашего проекта относятся к чтению данных, хранящихся в базе данных. Мы уже обсуждали нюансы индексов в MySQL, где говорилось, что MySQL предлагает вам для выбора различные типы SQL-индексов.

Основной тип индекса в MySQL - это индекс B-Tree, рассмотренный нами в одной из предыдущих статей. Если вы работаете с MySQL, то определенно знаете также о других нюансах индексов, одним из которых является тот факт, что индексы B-Tree могут строиться на нескольких столбцах (обычно их называют составными индексами). В этом примере мы используем MariaDB, хотя Percona Server для MySQL и MySQL Server будут вести себя идентично.

В приложении вы найдете запросы, воссоздающие структуру таблиц и составные индексы, так что давайте начнем.
Continue reading "Обзор индексов в MySQL: составные индексы B-Tree"

Улучшаем индексы: эффективный порядок столбцов ключа

Автор: Franck Pachot Improving Your SQL Indexing: How to
Effectively Order Columns



Пользователям нередко трудно подобрать лучший индекс для запроса, особенно
определить правильный порядок столбцов.



Представьте большую таблицу, которую нужно отфильтровать до конкретного
набора данных — всё ещё довольно объёмного. Вы можете использовать простые
условия, вроде эквивалентности или выборки диапазона, но ваш WHERE может
включать и более сложные условия — множественный выбор (IN) и комбинации (OR).



После фильтрации вы хотите показать лишь несколько строк, отсортированных по
некоторым столбцам, и ограничить результат с помощью LIMIT или FETCH FIRST ROWS
— типичный случай разбивки на страницы. Хотя индексы помогают находить
диапазоны значений и упорядочивать результаты, при всех этих условиях трудно
решить, в каком порядке располагать столбцы в индексе.

Continue reading "Улучшаем индексы: эффективный порядок столбцов ключа"

Использование гибридной транзакционной/аналитической обработки в PostgreSQL

Пересказ статьи Sheikh Wasiu Al Hasib. PostgreSQL Hybrid Transactional/Analytical Processing using




Что такое HTAP?


HTAP - это аббревиатура от гибридной транзакционной/аналитической обработки (Hybrid Transactional/Analytical Processing). Она характеризует системы баз данных, которые могут обрабатывать как транзакционные (OLTP), так и аналитические (OLAP) рабочие нагрузки одновременно на одном и том же наборе данных. Такая возможность позволяет выполнять аналитические запросы к текущим транзакционным данным без необходимости извлекать, преобразовывать и загружать (ETL) данные в отдельное хранилище для последующего анализа.

Continue reading "Использование гибридной транзакционной/аналитической обработки в PostgreSQL"

Настройка конфигурации PostgreSQL: лучшие практики и инструменты для повышения производительности

Пересказ статьи Uzzal Kumar Hore. PostgreSQL Configuration Tuning Best Practices and Tools for Production-Ready Performance


PostgreSQL является одной из наиболее мощных и универсальных баз данных с открытыми кодами, но установка из коробки не является вполне оптимизированной. Если вас серьезно беспокоит производительность - будь то OLTP, OLAP, смешанная нагрузка или данные временных рядов - важным моментом является настройка параметров конфигурации PostgreSQL.

Эта статья посвящена лучшим практикам настройки ключевых параметров PostgreSQL, обоснованию главных параметров конфигурации и разнообразным инструментам (включая, но не ограничиваясь timescaledb-tune), чтобы помочь автоматизировать или усовершенствовать этот процесс.

Почему PostgreSQL требует ручной настройки


Настройки по умолчанию в PostgreSQL намеренно консервативны - они рассчитаны на выполнение при минимальных аппаратных ресурсах. В результате, если вы имеете современную инфраструктуру (многоядерный ЦП, SSD, много оперативной памяти), эти параметры по умолчанию не могут в значительной мере использовать возможности вашей системы.
Continue reading "Настройка конфигурации PostgreSQL: лучшие практики и инструменты для повышения производительности"

Когда планировщик запросов PostgreSQL плутует: погружение в оптимизацию запросов

Пересказ статьи Shailesh Kumar Mishra. When PostgreSQL Query Planner Goes Rogue: A Deep Dive into Query Optimization


Вы администратор баз данных, эксперт в PostgreSQL, специалист RDS/Aurora или архитектор решений, который борется с внезапным замедлением запросов? Узнайте, как воздействие на планировщик запросов PostgreSQL может преобразовать долгие минуты выполнения запросов в чудо-миллисекунды. Это исследование реального случая в PostgreSQL 14.2 должен помочь в вашем подходе к настройке запросов базы данных.

Вызов: когда быстрые запросы становятся медленными


Недавно я столкнулся со следующей ситуацией. Наша команда разработки приложений заявила о резком падении производительности запроса, который обычно выполнялся за секунды, но внезапно начал отрабатывать за несколько минут. Это исследование предлагает бесценные идеи тем, кто работает с PostgreSQL, вне зависимости от обслуживания локальных установок или же облачных решений типа Amazon RDS или Aurora.
Continue reading "Когда планировщик запросов PostgreSQL плутует: погружение в оптимизацию запросов"

Понимание функциональных индексов в PostgreSQL

Пересказ статьи abdelrahman yasser. Understanding Functional Indexes in PostgreSQL


Что такое функциональный индекс?


В PostgreSQL индексы играют решающую роль в оптимизации производительности запросов. Обычно индексы ссылаются на один или более столбцов таблицы. Однако функциональный индекс определяется как результат функции, применяемой к одному или нескольким столбцам одной таблицы. Эти индексы позволяют выполнять быстрый доступ к данным на основе результатов вызова функции.

Как работают функциональные индексы?

Continue reading "Понимание функциональных индексов в PostgreSQL"

Упражнение по запросу: исправить такой вычисляемый столбец

Пересказ статьи Brent Ozar. Query Exercise: Fix This Computed Column


Возьмите базу данных Stack Overflow любого размера и посмотрите на столбец WebsiteUrl в таблице Users:



Иногда там попадается NULL, иногда пустая строка, иногда содержится неверный URL.

Скажем, наконец, кто-то решил попросить ChatGPT построить функцию для проверки валидности URL веб-сайтов, а затем использовал этот код для добавления нового столбца IsValidUrl в таблицу Users (и да, реальный клиент вдохновил меня на это пример): Continue reading "Упражнение по запросу: исправить такой вычисляемый столбец"

Снизить блокирование в SQL Server с помощью READ_COMMITTED_SNAPSHOT

Пересказ статьи Jared Westover. Reduce SQL Server Blocking with READ_COMMITTED_SNAPSHOT


Без блокировок дисковые таблицы ожидает хаос. Но вы испытываете неудобство от чрезмерных блокировок? Пользователи могут жаловаться на медленную работу приложения или отчеты готовятся целую вечность. Если так, то наличие специальной опции базы данных может ускорить ваши запросы. Но, как обычно, у всякой хорошей вещи есть обратная сторона.

В этой статье исследуется, как включение READ_COMMITTED_SNAPSHOT для вашей базы данных может облегчить чрезмерное блокирование. Сначала мы рассмотрим пример блокировок в нагруженной среде с уровнем изоляции по умолчанию Read Committed. Затем посмотрим на то, как включение уровня изоляции на основе версий строки снижает число блокированных чтений. К концу статьи вы будете готовы к тестированию этой возможности в вашей текущей среде.
Continue reading "Снизить блокирование в SQL Server с помощью READ_COMMITTED_SNAPSHOT"

DISTINCT и UNION: что произойдет, если использовать их вместе?

Пересказ статьи Louis Davidson. DISTINCT and UNION: What happens when you use them together


В одном из ответов к ветке об использовании SELECT * Aaron Cutshall заметил, что "еще одним из реальных убийц производительности является SELECT DISTINCT, особенно в сочетании с UNION. У меня есть целый список часто используемых скрытых «убийц» производительности!"

Я начал размышлять... Что происходит, когда вы используете их вместе? А когда вы используете UNION на множестве неуникальных строк, что происходит? Итак, я начал писать.

Continue reading "DISTINCT и UNION: что произойдет, если использовать их вместе?"