Skip to content

Антипаттерны 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 - окна с диапазонной рамкой"

Искусство хранимой процедуры SQL Server: типы данных

Пересказ статьи Erik Darling. The Art Of The SQL Server Stored Procedure: Data Types


Смесь и соответствие


Есть лишь несколько типов данных, которые нервируют меня, когда я их вижу:

    Строки MAX или близкие к верхнему пределу по байтам (за исключением динамического SQL)
    XML
    sql_variant

Не важно, являются ли они параметрами хранимой процедуры или объявляются в локальных переменных. Когда они появляются, я ожидаю следом чего-то плохого.
Continue reading "Искусство хранимой процедуры SQL Server: типы данных"

Обзор инструментов мониторинга для SQL Server

Пересказ статьи Hadi Fadlallah. An overview of SQL Server monitoring tools


Мониторинг базы данных: быстрое напоминание


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


Continue reading "Обзор инструментов мониторинга для SQL Server"

Расширенное тестирование с помощью WAITFOR в клиентских инструментах SQL Server.

Пересказ статьи Aaron Bertrand. Advanced testing with WAITFOR in SQL Server client tools


WAITFOR - это очень полезная команда для предотвращения выполнения последующих операций до тех пор, пока не пройдет определенное время (WAITFOR DELAY) или пока не наступит конкретное время (WAITFOR TIME). Эти команды достаточно хорошо обсуждались (включая "за" и "против") в предыдущей статье.
Continue reading "Расширенное тестирование с помощью WAITFOR в клиентских инструментах SQL Server."

Как меняется порядок выполнения SQL в зависимости от СУБД

Пересказ статьи Tobi Sam. How SQL Execution Orders Varies Across Databases


Почему нельзя использовать GROUP BY <порядковые позиции> в SQL Server, но можно в других.


Continue reading "Как меняется порядок выполнения SQL в зависимости от СУБД"