Skip to content

Сравнение 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"