Skip to content

Имеет ли значение порядок в GROUP BY?

Пересказ статьи Brent Ozar. Does Your GROUP BY Order Matter?


Иногда, когда вы используете GROUP BY, порядок столбцов имеет значение. Например, эти два запроса SELECT дают разные результаты:

CREATE INDEX Location_DisplayName
ON dbo.Users(Location, DisplayName);

SELECT TOP 100 Location, DisplayName, COUNT(*) AS Duplicates
FROM dbo.Users
GROUP BY Location, DisplayName
ORDER BY Location, DisplayName;

SELECT TOP 100 DisplayName, Location, COUNT(*) AS Duplicates
FROM dbo.Users
GROUP BY DisplayName, Location
ORDER BY DisplayName, Location;

Их действительные планы выполнения существенно разнятся:

Continue reading "Имеет ли значение порядок в GROUP BY?"

Все, что вам нужно знать об индексе в SQL Server

Пересказ статьи Lorenzo Uriel. Everything you Need to Know About Index in SQL Server





Цель настоящей статьи - рассказать просто об индексах в SQL Server, объяснив фундаментальные понятия и предложив практические советы по обслуживанию.

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

Темы


  • Обзор индексов

  • Типы индексов в SQL Server
    • Кластеризованные индексы.

    • Некластеризованные индексы.

    • Поколоночный и построчный индексы.

  • Фрагментация индексов
    • Внутренняя и внешняя.

    • Перестройка и реорганизация.

Continue reading "Все, что вам нужно знать об индексе в SQL Server"

Вставка столбца в середину таблицы

Пересказ статьи Steve Jones. Friday Flyway Tips – Inserting Column in the Middle of a Table


Заказчик мне задал вопрос, может ли Flyway Desktop (FWD) вызвать проблемы, если разработчики добавили столбцы в середину таблицы. Это обоснованное беспокойство, и данная статья показывает, что FWD не вызывает проблем, даже если ваши разработчики глупят.

Если только они не захотят это сделать специально.

Я много работал с Flyway Desktop с тех пор, как мы перешли с устаревших плагинов для SSMS на автономный инструмент.

Сценарий


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

CREATE TABLE Product
( ProductID INT NOT NULL CONSTRAINT ProductPK PRIMARY KEY
, ProductName VARCHAR(50)
, ProductDesc VARCHAR(1000)
, ProductSize CHAR(1)
, ProductWeight INT
, ProductColor VARCHAR(20)
, StatusID int
)
GO

Эта таблица имеет одинаковую структуру на сервере разработки и на продакшене, и мне нужно добавить новый столбец. Нам необходимо знать количество в упаковке, поскольку у новых товаров в коробке содержится несколько штук, так что необходимо добавить в таблицу столбец ProductQtyPerUnit.

Continue reading "Вставка столбца в середину таблицы"

Сравнение производительности TOP и MAX

Пересказ статьи Andy Brownsword. Comparing Performance of TOP vs. MAX


Как TOP(1), так и MAX могут использоваться для нахождения наибольшего значения в наборе данных. Хотя они приводят к одному и тому же результату, но делают это разными способами.

Для начала разберемся, в чем разница между ними?

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

Давайте перейдем к нескольким примерам с данными StackOverflow, а конкретно таблицы Votes.

Continue reading "Сравнение производительности TOP и MAX"

Антипаттерны SQL Server: характерные ошибки кода SQL

Пересказ статьи Rich Benner. SQL Server Antipatterns: Common Mistakes with SQL Code


В современном технически насыщенном мире от разработчиков требуется широкий диапазон навыков и языков программирования. Язык SQL обычно является одним из них. Это гарантирует, что в команде возможна взаимная поддержка на ежедневной основе, но это также может приводить к ошибкам в коде SQL.

Одной из потенциальных проблем здесь является нехватка времени для того, чтобы действительно глубоко вникать в каждый язык программирования, имеющийся в вашем арсенале. Что касается SQL Server, то язык, который там используется, весьма отличается от, скажем, C#. Эти языки основаны на обработке в итерационном процессе каждой строки отдельно в наборе данных. Это достаточно хорошо работает в подобных языках, но совершенно ужасно в SQL Server. Будучи языком, основанном на теории множеств, SQL Server предпочитает иметь дело сразу со всем множеством данных.
Continue reading "Антипаттерны SQL Server: характерные ошибки кода SQL"

Немного о тривиальных планах

Пересказ статьи Andy Brownsword. A Bit About Trivial Plans


Тривиальный план создается, когда у SQL Server нет никакого выбора по реализации. Вот пример из базы данных StackOverflow с удаленными индексами:



SELECT *
FROM dbo.Users
WHERE Id = 1234;

Здесь действительно нет никакого выбора помимо поиска в кластеризованном индексе. Это единственный индекс и это настолько же эффективно, насколько это возможно, учитывая, что мы фильтруем по ключу кластеризации для конкретного значения:



Continue reading "Немного о тривиальных планах"

Оптимизация предложений DISTINCT с помощью EXISTS

Пересказ статьи Andy Brownsword. Optimising DISTINCT Clauses using EXISTS


Предложение DISTINCT может помочь нам быстро убрать дубликаты из результатов запроса. Иногда полезно остановиться и спросить почему. Почему нам необходимо использовать это предложение, почему мы получаем дубликаты из наших данных?

Обычно я вижу это из-за применения JOIN, когда на самом деле нам не нужны все эти результаты. Это может быть проверка «существует ли что-либо», например, делал ли клиент когда-либо заказ раньше. Проблема возникает, когда имеется много возвращаемых строк, например, для постоянного клиента в нашем примере.

Continue reading "Оптимизация предложений DISTINCT с помощью EXISTS"

Изящная обработка ошибок с помощью логики TRY CATCH в хранимых процедурах SQL Server

Пересказ статьи Joydip Kanjilal. Gracefully Handle Errors using TRY CATCH Logic in SQL Server Stored Procedures


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

Имеется несколько способов обработки ошибок в хранимых процедурах SQL Server, таких как блоки TRY/CATCH, операторы RAISERROR и операторы THROW. Здесь мы обсудим то, как обрабатывать ошибки в хранимых процедурах SQL Server. Continue reading "Изящная обработка ошибок с помощью логики TRY CATCH в хранимых процедурах SQL Server"

Любопытный случай отсутствия функции FIRST_VALUE

Пересказ статьи Hugo Kornelis. Plansplaining part 28 – The curious case of the missing FIRST_VALUE function


В двадцать восьмой части серии plansplaining я завершаю мини-серию из шести частей, посвященную оконным функциям. После обсуждения основ, ускоренной оптимизации, завершения рамок окна на UNBOUNDED FOLLOWING, оконных рамок, задаваемых с RANGE вместо ROWS и LAG и LEAD мы рассмотрим аналитические функции LAST_VALUE и FIRST_VALUE и обнаружим, что функция, от которой мы ожидали присутствие в качестве внутренней агрегатной функции, вообще не существует! Мы также выясним, как SQL Server работает с этим. Continue reading "Любопытный случай отсутствия функции FIRST_VALUE"

Команда SQL WAITFOR для задержки выполнения кода SQL

Пересказ статьи Aubrey Love. SQL WAITFOR Command to Delay SQL Code Execution


Одной из наиболее редко используемых команд в SQL является команда WAITFOR. Она представляет один из вариантов заочно внести задержку в выполнение программы. По причине редкого использования часто забывается, как и где она может быть применена при необходимости. Например, мы могли бы ее использовать для имитации ответа пользователя или ввода, или, возможно, для сбора данных с определенными интервалами в течение дня. Continue reading "Команда SQL WAITFOR для задержки выполнения кода SQL"

Что делает ANSI_NULLS?

Пересказ статьи Chad Callihan. What Does ANSI_NULLS Do


Видели ли вы когда-нибудь установку ANSI_NULLS в значение On или OFF в скрипте или хранимой процедуре? Я видел или слышал упоминание об этом несколько раз за последнее время и подумал, что будет полезно продемонстрировать на примере действие этой настройки.
Continue reading "Что делает ANSI_NULLS?"

Экспорт и импорт данных в SQL Server, используя файлы

Пересказ статьи Edward Pollack. Exporting and Importing Data into SQL Server Using Files


Имеется много доступных приложений и инструментов, которые позволяют перемещать данные в/из SQL Server. Некоторые инструменты встроены Microsoft, такие как SSIS или Azure Data Factory. Другие созданы третьими сторонами, такие как Databricks или Snowflake. Другие доступные варианты используют возможности SQL Server и полагаются на собственные возможности писать эффективный код для получения данных из точки А в точку Б.
Continue reading "Экспорт и импорт данных в SQL Server, используя файлы"

Целые автоинкрементируемые ID или UUID в таблицах базы данных: что выбрать?

Пересказ статьи Kamruzzaman Kamrul. Auto-Increment Integer IDs vs. UUIDs in Database Tables: Which to Choose


При проектировании базы данных нужно принять одно важное решение - каким образом уникально идентифицировать каждую запись. Двумя популярными методами являются использование целочисленных автоинкрементируемых ID и универсальных уникальных идентификаторов (UUID). Тут я пытаюсь показать преимущества и недостатки каждого метода.
Continue reading "Целые автоинкрементируемые ID или UUID в таблицах базы данных: что выбрать?"

Более эффективный подсчет

Пересказ статьи Aaron Bertrand. Counting more efficiently


Почти десятилетие назад я написал статью с названием «Вредные привычки: трудный подсчет строк». В той статье я говорил о том, как мы можем использовать метаданные для мгновенного получения числа строк в таблице. Обычно люди делают следующее, что приводит к чтению всей таблицы или индекса:

DECLARE @c int = (SELECT COUNT(*) FROM dbo.TableName);

Чтобы в значительной степени избежать ограничений на размер данных, вместо этого мы можем использовать sys.partitions. Continue reading "Более эффективный подсчет"

Планирование планов. Часть 26 - окна с диапазонной рамкой

Пересказ статьи Hugo Kornelis. Plansplaining part 26 – Windows with a ranged frame


Это двадцать шестая часть данной серии (plansplaining). И уже четвертый эпизод об оконных функциях. Первая из этих статей была посвящена базовым оконным функциям; вторая была посвящена быстрой оптимизации накопительных агрегатов, а в третьей публикации объяснялось, как оптимизатор работает при отсутствии поддержки плана выполнения для UNBOUNDED FOLLOWING.
Continue reading "Планирование планов. Часть 26 - окна с диапазонной рамкой"