Skip to content

Что происходит при удалении столбца в таблице SQL Server? Где мое пространство?

Пересказ статьи Cláudio Silva. What happens when we drop a column on a SQL Server table? Where's my space


Короткий ответ: столбец отмечается как "удаленный" и перестанет быть видимым/используемым. Но, что наиболее важно - размер записи/таблицы останется неизменным.

Операция с метаданными


Удаление столбца является логической операцией с метаданными, а не физической. Это означает, что данные не удаляются/перезаписываются при этом действии. Если говорить об удалении данных (записей), то как упоминает здесь Пол Рэндал:

«стоимость этого будет отложена для вставляющих, а не для удаляющих».
Continue reading "Что происходит при удалении столбца в таблице SQL Server? Где мое пространство?"

Понимание разницы в производительности при добавлении столбцов в PostgreSQL

Пересказ статьи Hagen Hübel. Understanding the Performance Difference in Adding Columns in PostgreSQL


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



Вопрос


Представьте, что у вас есть большая таблица, содержащая десятки тысяч записей. Вы хотите добавить новый допускающий NULL-значения столбец без значения по умолчанию, а затем выполнить оператор UPDATE, чтобы установить для этого нового столбца заданное значение. Этот процесс занимает значительное время. Однако, если вы вместо этого добавляете новый столбец со значением по умолчанию, это не занимает так много времени. Почему имеет место такая разница в производительности?
Continue reading "Понимание разницы в производительности при добавлении столбцов в PostgreSQL"

Статические курсоры

Пересказ статьи Hugo Kornelis. Plansplaining part 30 – Static cursors


В части 30 серии plansplaining мы продолжим обсуждение обработки курсоров. Я рекомендую вам сначала прочитать предыдущую статью, где я излагаю основы.

Тестовый запрос


В этой серии я буду придерживаться использования одного и того же тестового запроса, который выводит данные по продажам и товарам, которые были проданы в количестве более 10 единиц в пределах заданного диапазона заказов.
Continue reading "Статические курсоры"

Оптимизация MySQL: удаление данных

Пересказ статьи Lukas Vileikis. Optimizing MySQL: Deleting Data


Удаление данных - основы


Спросите любого администратора баз данных, как удалить данные, и вы услышите об одном или двух следующих методов:

  1. Выполните запрос DELETE - запросы DELETE довольно самоочевидны, и они удаляют строки в таблицах базы данных.

  2. Выполните запрос TRUNCATE - TRUNCATE - это брат DELETE с тем главным отличием, что DELETE удаляет подмножество строк, а TRUNCATE удаляет все строки таблицы. TRUNCATE имеет еще одно отличие - он значительно быстрей, чем DELETE при удалении всех строк таблицы, поскольку он имеет меньше накладных расходов. Но давайте начнем с начала.


Для начала рассмотрим обычный запрос DELETE, который в MySQL выглядит следующим образом:

DELETE FROM имя_таблицы WHERE [логическое_выражение]

По частям:
Continue reading "Оптимизация MySQL: удаление данных"

Примеры команды SQL Bulk Insert

Пересказ статьи Rick Dobson. SQL Bulk Insert Command Examples


Оператор BULK INSERT в T-SQL специально разработан для переноса содержимого больших файлов в таблицы SQL Server. Однако операторы bulk insert могут использоваться как для больших файлов, так и для малых и/или множества файлов среднего размера. Если вы предпочитаете программировать на T-SQL или считаете, что SSIS - это слишком тяжело для некоторых из ваших проектов по импорту файлов, операторы bulk insert могут предоставить нужный уровень поддержки и дать выигрыш в производительности.

Здесь представлены еще три практических примера использования bulk insert. В конце статьи есть ссылка на скачивание тестовых данных для каждого примера случая использования и дополнительные наборы данных для практики с ними.
Continue reading "Примеры команды SQL Bulk Insert"

Мастерство работы с индексами в SQL Server: выбор правильного порядка столбцов

Пересказ статьи Eitan Blumin. SQL Server Index Mastery: Choosing the Right Column Order


Введение


Оптимизация производительности SQL Server - непростая тема, и проектирование индексов играет в ней жизненно важную роль, способствуя эффективности выполнения запросов к базе данных.

Одним из ключевых аспектов, которые часто влияют на производительность, является порядок столбцов в индексе.

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

Возможности SQL*Plus в Oracle Database 23ai

Пересказ статьи Christopher Jones. Powering on with SQL*Plus for Oracle Database 23ai


При фантастических заявлениях относительно возможностей Oracle Database 23ai, которые уже в целом доступны, я захотел поделиться некоторыми улучшениями в SQL*Plus 23ai.

Традиционный инструмент командной строки в Oracle SQL*Plus остается привычным для многих пользователей баз данных Oracle. Он позволяет выполнять ad-hoc операторы SQL к базе данных Oracle или создавать скрипты операторов для выполнения. Инструмент включается во все установки ПО базы данных и легко устанавливается на других машинах с помощью небольших свободно распространяемых пакетов ZIP (или RPM) Oracle Instant Client. Никаких переходов по ссылкам, никакого длительного времени выполнения. Вы просто распаковываете архив, устанавливаете PATH или LD_LIBRARY_PATH и начинаете его использовать. (Инструкции по установке на Linux находятся здесь.)

Continue reading "Возможности SQL*Plus в Oracle Database 23ai"

Что делает хинт запроса OPTION (FAST N)?

Пересказ статьи Chad Callihan. What is the OPTION (FAST N) Query Hint?


Как вы познакомились с хинтом запроса OPTION (FAST N)? Я никогда его не использовал раньше, поэтому решил немного поэкспериментировать с ним. Давайте посмотрим, что он делает, и как его применять в запросе.

Что такое OPTION (FAST N)


При использовании хинта запроса OPTION (FAST N) SQL Server пытается сфокусироваться на получении N строк. Пусть, например, я выполняю запрос, который должен вернуть сотни строк. Я могу захотеть посмотреть первые 50 или около того как можно быстрее с тем, чтобы начать анализировать их, пока запрос завершает получение остальных строк. Continue reading "Что делает хинт запроса OPTION (FAST N)?"

Это будущее SQL? Исследуем синтаксис Pipe

Пересказ статьи Mateus Trentz. Is this the future of SQL? Exploring the Pipe Syntax




Некоторое время назад Google анонсировал предположительно новые улучшения в SQL, более интуитивный способ написания запросов к базам данных, используя синтаксис Pipe. Этот синтаксис следует порядку выполнения, который теоретически сделает запросы легче для понимания:

FROM table
|> WHERE values > 10
|> SELECT id, name, value

Continue reading "Это будущее SQL? Исследуем синтаксис Pipe"

Фильтрованные индекс в SQL Server: основы

Пересказ статьи Simon Liew. SQL Server Filtered Index Essentials Guide


Фильтрованные индексы могут значительно повысить производительность запроса, но простые ошибки могут помешать их использованию. Мы поможем вам понять, как использовать фильтрованные индексы SQL Server и выявить запросы, которые могут получить от этого преимущество, которого они не имели.

Фильтрованные индексы - это обычные некластеризованные индексы, которые содержат только подмножество данных (фильтрованные данные). Фильтрованные индексы особенно полезны для узкого покрытия запроса, который требует быстрого извлечения и высокой доступности.

Ключом для правильного использования оптимизатором SQL Server фильтрованных индексов является:

  1. Убедиться, то предикат (предикаты) запроса эквивалентны выражению фильтрованного индекса. Иногда предикат не должен точно совпадать с выражением, и оптимизатор SQL Server может определить это. Однако чем проще, тем лучше.

  2. Предикат ((предикаты) запроса на столбце (столбцах) фильтрованного индекса не параметризуются или не используют присвоение переменной.
Continue reading "Фильтрованные индекс в SQL Server: основы"

Функция date_trunc в PostgreSQL

Пересказ статьи Peyman. date_trunc function in PostgreSQL


Недавно мне потребовалось написать запрос SQL для получения множества данных из большой таблицы за конкретный интервал времени. Я не знаю, есть ли более простой способ в SQL, чтобы сделать это, я же обнаружил в PostgreSQL функцию date_trunc, которая является отличным решением моей проблемы.

Проблема на примере

Рассмотрим следующую таблицу.



И мы хотим получить по одной строке в час (или последнюю цену для каждого часа) для полета AB12. Вывод должен выглядеть примерно так.


Continue reading "Функция date_trunc в PostgreSQL"

Обобщенный инвертированный индекс в PostgreSQL

Пересказ статьи Yash Marathe. Generalized Inverted Index in PostgreSQL


Исследование достоинств и недостатков GIN-индексов в PostgreSQL

Содержание

  1. Мотивация

  2. Введение

  3. GIN-индексирование изнутри

  4. Практический пример

  5. Уроки индекса GIN Trigram GitLab

  6. Заключение

  7. Ссылки

Continue reading "Обобщенный инвертированный индекс в PostgreSQL"

Шпаргалка по правильному написанию запросов к SQL Server: условное соединение и предложение WHERE

Пересказ статьи Erik Darling. The How To Write SQL Server Queries Correctly Cheat Sheet Conditional Join and Where Clauses


Так или иначе


Оператор OR вполне легитимно может использоваться в операторах SQL. Если вы используете предложение IN, велика вероятность, что оптимизатор преобразует его в последовательность операторов OR.

Например, IN(1, 2, 3) может в результате стать = 1 OR = 2 OR = 3 без вашего участия. Оптимизаторы так забавляются. Забавные маленькие кролики.

Проблема обычно возникает не тогда, когда вы пишете в запросе IN или OR для одного столбца со списком литеральных значений, а когда вы:

  • Используете OR по множеству столбцов в предложении WHERE.

  • Используете OR в предложении JOIN любого сорта.

  • Используете OR для обработки параметров или переменных NULL.

Добавьте немного сложности, объединив две таблицы и попросив что-то вроде: Continue reading "Шпаргалка по правильному написанию запросов к SQL Server: условное соединение и предложение WHERE"

Раскройте силу обновляемых представлений в SQL Server

Пересказ статьи Prakash K. Unlocking Power with Updatable Views in SQL Server


Реляционные системы управления базами данных (РСУБД) основаны на структурированном языке запросов (SQL) в плане управления и манипуляции данными. Представления в SQL Server предоставляют эффективный способ абстрагироваться от лежащих в основании сложных структур данных. В то время как многие представления доступны только на чтение, обновляемые представления открывают дверь к динамической манипуляции данными с помощью операций INSERT, UPDATE и DELETE. В этом руководстве мы познакомимся с понятием обновляемых представлений в SQL Server, исследуем операции с ними и дадим полезный пример.

Понятие обновляемого представления


Обновляемое представление в SQL Server - это представление, которое допускает модификацию, т.е. применение таких операторов, как INSERT, UPDATE или DELETE к таблицам через представление. Чтобы сделать представление обновляемым, оно должно удовлетворять нижеприведенным критериям.
Continue reading "Раскройте силу обновляемых представлений в SQL Server"

GENERATE_SERIES в SQL Server

В SQL Server 2022 появилась функция генерации числовой последовательности, GENERATE_SERIES. Подобная функция имеется в некоторых других СУБД, в частности, в PostgreSQL. Вот, например, как с помощью этой функции решалась следующая задача из учебника.

Вывести последовательность дат между датами первого и последнего полета пассажира с id_psg = 5.

Решение:

SELECT generate_series(MIN(date), MAX(date), '1 day')
FROM pass_in_trip
WHERE id_psg = 5;

Continue reading "GENERATE_SERIES в SQL Server"