Пересказ статьи 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?"
Пересказ статьи 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 "Вставка столбца в середину таблицы"
Пересказ статьи Andy Brownsword. Comparing Performance of TOP vs. MAX
Как TOP(1), так и MAX могут использоваться для нахождения наибольшего значения в наборе данных. Хотя они приводят к одному и тому же результату, но делают это разными способами.
Для начала разберемся, в чем разница между ними?
Предложение TOP ограничивает число результатов, возвращаемых запросом; тут мы рассматриваем единственный результат. При использовании MAX, напротив, мы применяем функцию к нашим данным, чтобы выбрать из них максимальное значение.
Давайте перейдем к нескольким примерам с данными StackOverflow, а конкретно таблицы Votes.
Continue reading "Сравнение производительности TOP и MAX"
Пересказ статьи 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 "Немного о тривиальных планах"
Пересказ статьи Andy Brownsword. Optimising DISTINCT Clauses using EXISTS
Предложение DISTINCT может помочь нам быстро убрать дубликаты из результатов запроса. Иногда полезно остановиться и спросить почему. Почему нам необходимо использовать это предложение, почему мы получаем дубликаты из наших данных?
Обычно я вижу это из-за применения JOIN, когда на самом деле нам не нужны все эти результаты. Это может быть проверка «существует ли что-либо», например, делал ли клиент когда-либо заказ раньше. Проблема возникает, когда имеется много возвращаемых строк, например, для постоянного клиента в нашем примере.
Continue reading "Оптимизация предложений DISTINCT с помощью EXISTS"
Пересказ статьи 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"
Пересказ статьи 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"
Пересказ статьи Aubrey Love. SQL WAITFOR Command to Delay SQL Code Execution
Одной из наиболее редко используемых команд в SQL является команда WAITFOR. Она представляет один из вариантов заочно внести задержку в выполнение программы. По причине редкого использования часто забывается, как и где она может быть применена при необходимости. Например, мы могли бы ее использовать для имитации ответа пользователя или ввода, или, возможно, для сбора данных с определенными интервалами в течение дня.
Continue reading "Команда SQL WAITFOR для задержки выполнения кода SQL"
Пересказ статьи Chad Callihan. What Does ANSI_NULLS Do
Видели ли вы когда-нибудь установку ANSI_NULLS в значение On или OFF в скрипте или хранимой процедуре? Я видел или слышал упоминание об этом несколько раз за последнее время и подумал, что будет полезно продемонстрировать на примере действие этой настройки.
Continue reading "Что делает ANSI_NULLS?"
Пересказ статьи 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, используя файлы"
Пересказ статьи 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 "Более эффективный подсчет"
Пересказ статьи Hugo Kornelis. Plansplaining part 26 – Windows with a ranged frame
Это двадцать шестая часть
данной серии (plansplaining). И уже четвертый эпизод об оконных функциях.
Первая из этих статей была посвящена базовым оконным функциям;
вторая была посвящена быстрой оптимизации накопительных агрегатов, а в
третьей публикации объяснялось, как оптимизатор работает при отсутствии поддержки плана выполнения для UNBOUNDED FOLLOWING.
Continue reading "Планирование планов. Часть 26 - окна с диапазонной рамкой"