Skip to content

IDENTITY или SEQUENCE в SQL Server – что использовать?

Пересказ статьи Greg Low. IDENTITY vs SEQUENCE in SQL Server – which should you use?


Автоматически генерируемые числовые ключи имеются повсюду в реляционных базах данных. В SQL Server доминируют две возможности этого:


Обе генерируют числа. Обе быстры. Обе широко используются. Хотя в настоящее время столбцы IDENTITY являются, безусловно, наиболее распространенными - однако при работе с клиентами мы склонны использовать почти исключительно объекты SEQUENCE. Все, что я могу сделать со столбцом IDENTITY, я могу так же сделать с объектом SEQUENCE, но мы считаем его более гибким.

Вот простой пример. Если вы когда либо пытались выполнить SET IDENTITY_INSERT ON по связанным серверам, то знаете, что это не работает. С SEQUENCE мне никогда не понадобится выполнять такую операцию.
Continue reading "IDENTITY или SEQUENCE в SQL Server – что использовать?"

Проблемы параллелизма SQL Server с планами одновременно выполняющихся запросов

Пересказ статьи Mehdi Ghapanvari. SQL Server Concurrency Issues with Parallel Query Plans


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

Параллелизм позволяет SQL Server выполнять запросы на нескольких ядрах ЦП одновременно. Оптимизатор запросов определяет, стоит ли выполнять запрос параллельно или нет на основании стоимости. Если запрос сложный, содержит дорогие операции (такие как сортировка, группировка и т.п.) и обрабатывает много строк, то это с большей вероятностью приведет к параллельному плану, чем простой запрос, который обрабатывает несколько строк.
Continue reading "Проблемы параллелизма SQL Server с планами одновременно выполняющихся запросов"

Ответы на вопросы относительно удаленных столбцов

Пересказ статьи Cláudio Silva. Answering Questions On Dropped Columns


В этой статье я отвечу на пару вопросов из предыдущих публикаций об удалении столбцов.

Если вы не читали предыдущих постов по этой теме, вот их список:

Комментарии


В разделе комментариев к первой статье читатель спрашивает:

Можно ли считать, что будущие вставки (после удаления столбца) не будут занимать пространство удаленного столбца?

и еще

Если страница перезаписывается (например, в результате обычной вставки или обновления), используется ли тогда повторно пространство, занимаемое удаленным столбцом?
Continue reading "Ответы на вопросы относительно удаленных столбцов"

Оптимизация заданий загрузки данных в SQL Server: стратегии реализации в рабочей среде

Пересказ статьи Arvind Toorpu. Optimizing Data Loader Jobs in SQL Server: Production Implementation Strategies


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

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


Continue reading "Оптимизация заданий загрузки данных в SQL Server: стратегии реализации в рабочей среде"

Сравнение DATE_BUCKET и DATETRUNC

Пересказ статьи Chad Callihan. Comparing DATE_BUCKET and DATETRUNC


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

DATE_BUCKET


Начнем с DATE_BUCKET. DATE_BUCKET дает вам возможность агрегировать данные на основе выбранного вами интервала. Допустим, мы имеем такой набор событий:


Continue reading "Сравнение DATE_BUCKET и DATETRUNC"

Восстановление журнала транзакций базы данных SQL Server

Пересказ статьи davidfowler. Rebuilding a SQL Server Database Transaction Log


"Не могли бы вы помочь мне, мы удалили файл журнала транзакций базы данных и теперь она застряла в ‘Recovery Pending’?"

Такой крик о помощи я получил пару недель назад.

"Конечно, без проблем, нам придется восстановить вашу последнюю резервную копию", - ответил я.

А потом неизбежное: "Это только база данных разработки, мы не делаем резервных копий."

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

Итак мы имеем следующую ситуацию: база данных недоступна, отсутствует журнал транзакции и нет резервной копии. Что можно сделать? Фактически у нас есть только один вариант - мы должны восстановить журнал транзакций.
Continue reading "Восстановление журнала транзакций базы данных SQL Server"

Иерархические типы данных

Пересказ статьи Florent Jardin. Hierarchical data types


Стандарт SQL определяет ряд правил, которые позволяют системам баз данных быть взаимозаменяемыми, но в реальности есть небольшие особенности. В этой связи тип данных hierarchyid в SQL Server является показательным примером. Если вы перейдете на PostgreSQL, вам будут доступны два решения.

Первое и более простое решение - это связать каждый узел со своим родителем, используя новый столбец parentid и применяя ограничение внешнего ключа. Другой более сложный подход заключается в использовании расширения ltree. В данной статье рассматривается последний вариант.
Continue reading "Иерархические типы данных"

Зло (и польза) DISTINCT

Пересказ статьи Louis Davidson. The evil (and value) of DISTINCT


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

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

В этой статье я рассмотрю правильное и явно опасное использование DISTINCT, а также покажу, как вы можете протестировать ваш запрос, который использует DISTINCT, чтобы увидеть, что он на самом деле скрывает.
Continue reading "Зло (и польза) DISTINCT"

Оптимизация поиска при использовании SQL LIKE с подстановочными знаками

Пересказ статьи Simon Liew. Optimize SQL LIKE Wildcard Searches


Полный поиск по шаблону (например, LIKE '%поисковая_фраза%') в Microsoft SQL Server может быть медленным и неэффективным, поскольку гарантируется сканирование всех строк в таблице. Имеются ли какие-нибудь варианты оптимизации запросов с оператором SQL LIKE?

Оптимизация независимого от регистра полного поиска по шаблону с начальным и конечным подстановочным знаком является проблемой в базах данных SQL - эти шаблоны LIKE не получают выгоды от индексирования. Здесь исследуются потенциальные варианты оптимизации такого поиска и проверяются распространенные заблуждения.
Continue reading "Оптимизация поиска при использовании SQL LIKE с подстановочными знаками"

Слишком много индексов — это сколько?

Пересказ статьи Brent Ozar. How Many Indexes Is Too Many?


Давайте начнем с базы данных Stack Overflow (будет работать версия любого размера), удалим все индексы на таблице Users и выполним DELETE:

SET STATISTICS IO ON;
GO
BEGIN TRAN
DELETE dbo.Users WHERE DisplayName = N'Brent Ozar';

Я использую SET STATISTICS IO ON, о чем мы говорили в статье "Как думать подобно серверу SQL Server" для иллюстрации количества прочитанных данных, и я делаю это в транзакции, которую я могу периодически откатывать, каждый раз демонстрируя полученные эффекты. Вот действительный план выполнения:


Continue reading "Слишком много индексов — это сколько?"

10 простых запросов на T-SQL, которые вы будете использовать каждый день

Пересказ статьи rebecca@sqlfingers. 10 T-SQL One-Liners You'll Use Every Day


Каждый администратор баз данных держит в голове инструментарий готовых запросов. Некоторым потребовались годы, чтобы научиться. Некоторые были случайно обнаружены во время работы в 2 часа ночи. Сегодня я поделюсь 10-ю моими самыми любимыми короткими запросами T-SQL, теми, что копируешь, вставляешь и сразу чувствуешь себя гением. Некоторые из них - классические, некоторые - из недавнего пополнения, и все из них полезны. Ставьте закладку, я надеюсь, что вы сюда вернетесь.

1. Генерация числовой последовательности на лету


Нужно быстро получить последовательность чисел без создания таблицы подсчета? Если вы имеете SQL Server 2022 или более позднюю версию, GENERATE_SERIES - ваш новый лучший друг:

SELECT value FROM GENERATE_SERIES(1, 100);

Это все. Одна строка кода. 100 строк в последовательности. Никаких временных таблиц, никаких CTE, никаких перекрестных соединений. Аналогичный прием для диапазона дат. Используйте это для получения каждого дня 2025 года в одной строке:

SELECT DATEADD(DAY, value, '2025-01-01') AS dt FROM GENERATE_SERIES(0, 364);

Версия: SQL Server 2022+ (уровень совместимости 160+)
Continue reading "10 простых запросов на T-SQL, которые вы будете использовать каждый день"

Функция JSON_CONTAINS в SQL Server 2025

Пересказ статьи Koen Verbeeck. JSON_CONTAINS Function in SQL Server 2025


У меня есть данные, пришедшие в мой SQL Server в формате JSON. Перед началом парсинга, который довольно интенсивный, необходимо проверить, присутствуют ли некоторые значения в этом JSON. Имеется ли функция, которую я могу использовать с этой целью? Давайте посмотрим, что может делать JSON_CONTAINS, новая функция в SQL Server 2025.

Формат файла JSON поддерживается в SQL Server, начиная с версии 2016, когда были введены функции OPENJSON и JSON_VALUE. Отличное введение в возможности SQL Server 2016 можно найти здесь: Продвинутые методы JSON в SQL Server, часть 1, часть 2 и <часть 3/a>.

С каждый релизом добавляется новая функциональность для обработки данных JSON. Недавно в Azure SQL DB был реализован
тип данных JSON, который теперь нашел свое применение в SQL Server 2025. Это последний предварительный релиз SQL Server на момент написания этой статьи. В отличие от многих других новых функций SQL Server, этот предварительный выпуск включает новую функциональность, которая доступна только в SQL Server 2025, но не в облачных аналогах, таких как база данных Azure SQL DB. Одной из этих новых функций является JSON_CONTAINS, которой и посвящена эта статья.
Continue reading "Функция JSON_CONTAINS в SQL Server 2025"

T-SQL в SQL Server 2025: функции кодирования

Пересказ статьи Steve Jones. T-SQL in SQL Server 2025: Encoding Functions


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

Функции кодирования: BASE64_ENCODE и BASE64_DECODE


В язык T-SQL были добавлены две новых функции: BASE64_ENCODE, BASE64_DECODE . Эти функции взаимно обратны, подобно функциям шифрования. Одна функция возвращает вспять действия другого, и они предназначены для совместного использования.
Continue reading "T-SQL в SQL Server 2025: функции кодирования"

Как создать связанный сервер в SQL Server для Oracle 26ai Free

Пересказ статьи Greg Low. How to Create a SQL Server Linked Server to Oracle 26ai Free


Легко перемещайте данные из SQL Server в Oracle 26ai Free, используя это пошаговое руководство. Узнайте как установить связанный сервер, сконфигурировать FREEPDB1 и избежать типичных ошибок.

Недавно мне пришлось перенести некоторые данные из SQL Server на Oracle 26ai в редакции Free. Я решил проверить, поможет ли связанный сервер сделать эту работу, поскольку зачастую это самый простой способ…

Это позволит мне просто писать операторы INSERT SELECT, но в SQL Server, связанные серверы с Oracle, известны своей неуклюжестью и часто имеют проблемы с некоторыми типами данных, настройками времени, и т. д.

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

"Простая" функция, которой нет: миграция функции T-SQL STR() в PostgreSQL

Пересказ статьи Assaf Fraenkel. The “Simple” Function That Isn’t: Migrating T-SQL’s STR() to PostgreSQL


Иногда миграция оказывается более сложной, чем ожидалось. На первый взгляд определение функции STR в SQL Server является простым: она возвращает символьное представление числовых данных, выровненные по правому краю с заданной длиной и точностью до десятичных знаков. Однако при попытке конвертации вы обнаруживаете огромное число пограничных случаев, большинство из которых плохо документированы.

Техническая спецификация


Стандартной спецификацией этой функции является:

STR ( float_expression [ , length [ , decimal ] ] )
  • Значение по умолчанию Length (длина): 10
  • Значение по умолчанию Decimal (масштаб): 0
Continue reading ""Простая" функция, которой нет: миграция функции T-SQL STR() в PostgreSQL"