Skip to content

Разница между CTE и подзапросами в SQL: полноценное руководство для разработчиков

Автор: Vivek Johari Difference Between CTE and Subqueries in SQL: A Complete Guide for Developers


Язык структурированных запросов (SQL) — основа манипулирования и извлечения данных в современных базах. Будь то MySQL, PostgreSQL, SQL Server или Oracle, SQL предоставляет мощные инструменты для эффективной работы с данными. Среди них важнейшую роль в упрощении сложных операций играют Common Table Expressions (CTE) и подзапросы.


Однако многие разработчики — особенно начинающие — задаются вопросом, чем именно отличаются CTE от подзапросов, когда выбирать одно вместо другого и как каждый влияет на читаемость, производительность и сопровождение.


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


Это руководство подробно разбирает разницу между CTE и подзапросами в SQL, с примерами, вариантами применения и советами по оптимизации, которые сделают вас более эффективным SQL‑разработчиком.


Continue reading "Разница между CTE и подзапросами в SQL: полноценное руководство для разработчиков"

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

Пересказ статьи Chandan Shukla. From Rows to Pages: The Hidden Chaos Behind SQL Server’s Sampling Methods


Введение


Выборка данных является обычным требованием, применимым ко многим реальным рабочим нагрузкам SQL Server, пытаетесь ли вы протестировать подмножество данных, выполняете просмотр записей перед экспортом, или строите небольшую копию таблицы для разработки, выборка становится необходимым инструментом. SQL Server предлагает оператор TABLESAMPLE, который на первый взгляд выглядит простым и многообещающим. Написав запрос типа select top 100 from Orders tablesample 10 percent, вы естественно ожидаете, что SQL Server вернет 10 процентов случайных строк. К сожалению, это не так работает.

Предложение TABLESAMPLE работает не с отдельными строками, а с физическими страницами данных. Это означает, что SQL Server пытается вернуть строки из приблизительно 10 процентов от общего числа страниц, а не строк. Если ваши данные равномерно распределены и каждая страница заполнена, это может дать вам результаты, близкие к 10 процентам строк. Но в реальности, благодаря фрагментации, обновлениям и удалениям, большинство страниц содержат различное число строк. Именно тут TABLESAMPLE становится весьма непредсказуемым. Давайте смоделируем эту ситуацию на простом примере для демонстрации поведения на практике.
Continue reading "От строк к страницам: скрытый хаос в методах выборки внутри SQL Server"

Новые функции SQL Regex в SQL Server 2025 и SSMS

Пересказ статьи Scott Murray. New SQL Regex Functions in SQL Server 2025 and SSMS


Если вы похожи на меня, то Regex - это одна из тех древних технологий/инструментов, которые вы никогда в достаточной мере не изучали. Вас может удивить, что Regex (регулярное выражение) на самом деле появились в 1950-х годах в период разработки многих современных компьютеров (Регулярное выражение — Википедия). Конечно, как и многие основные инструменты, они нарастили за последние 70 лет функциональность и области использования.

Использование регулярных выражений в SQL Server было ограничено выходом за пределы SQL Server для выполнения их функций через внешнюю службу, такую как использование процедур CLR. К счастью в 2024 Microsoft наконец начал добавление прямой поддержки, сначала в базах данных Azure SQL, а сейчас такая функциональность доступна в SQL Server 2025. В итоге в SQL Server стали доступными несколько Regex-функций, которые и будут тут рассмотрены. Основой реализации в SQL Server стала библиотека RE2 (RE2 Regular Expression Syntax).

Continue reading "Новые функции SQL Regex в SQL Server 2025 и SSMS"

Как использовать новую функцию PRODUCT() в SQL Server 2025

Пересказ статьи Edward Pollack. How to Use the New PRODUCT() Function in SQL Server 2025


С каждой новой версией SQL Server всегда появляются новые возможности, которые радуют нас тем, что наконец-то мы получили доступ к полезной функции, которая уже повсюду имеется.

Введенная в SQL Server 2025 CTP 1.3 функция PRODUCT() действует подобно SUM(), но не суммирует значения, а перемножает их. Это агрегатная функции в SQL Server и, следовательно, она работает с набором данных, а не с отдельными значениями.

Вычисление произведения без PRODUCT()


До появления этой функции написание на T-SQL перемножение ряда значений в множественной парадигме было возможно, хотя и не совсем красивым. Рассмотрим сценарий, в котором необходимо перемножить множество значений по времени для расчета постоянно растущей мультипликативной метрики, такой как проценты или инфляция.
Continue reading "Как использовать новую функцию PRODUCT() в SQL Server 2025"

Упражнение по запросу: исправить такой вычисляемый столбец

Пересказ статьи Brent Ozar. Query Exercise: Fix This Computed Column


Возьмите базу данных Stack Overflow любого размера и посмотрите на столбец WebsiteUrl в таблице Users:



Иногда там попадается NULL, иногда пустая строка, иногда содержится неверный URL.

Скажем, наконец, кто-то решил попросить ChatGPT построить функцию для проверки валидности URL веб-сайтов, а затем использовал этот код для добавления нового столбца IsValidUrl в таблицу Users (и да, реальный клиент вдохновил меня на это пример): Continue reading "Упражнение по запросу: исправить такой вычисляемый столбец"

Снизить блокирование в SQL Server с помощью READ_COMMITTED_SNAPSHOT

Пересказ статьи Jared Westover. Reduce SQL Server Blocking with READ_COMMITTED_SNAPSHOT


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

В этой статье исследуется, как включение READ_COMMITTED_SNAPSHOT для вашей базы данных может облегчить чрезмерное блокирование. Сначала мы рассмотрим пример блокировок в нагруженной среде с уровнем изоляции по умолчанию Read Committed. Затем посмотрим на то, как включение уровня изоляции на основе версий строки снижает число блокированных чтений. К концу статьи вы будете готовы к тестированию этой возможности в вашей текущей среде.
Continue reading "Снизить блокирование в SQL Server с помощью READ_COMMITTED_SNAPSHOT"

DISTINCT и UNION: что произойдет, если использовать их вместе?

Пересказ статьи Louis Davidson. DISTINCT and UNION: What happens when you use them together


В одном из ответов к ветке об использовании SELECT * Aaron Cutshall заметил, что "еще одним из реальных убийц производительности является SELECT DISTINCT, особенно в сочетании с UNION. У меня есть целый список часто используемых скрытых «убийц» производительности!"

Я начал размышлять... Что происходит, когда вы используете их вместе? А когда вы используете UNION на множестве неуникальных строк, что происходит? Итак, я начал писать.

Continue reading "DISTINCT и UNION: что произойдет, если использовать их вместе?"

Удаление ведущих нулей в SQL Server

Пересказ статьи Steve Stedman. Removing Leading Zeros in SQL Server


При работе с данными в SQL server иногда возникает потребность удалить ведущие нули в строке. Эта задача является довольно общей, в частности, при работе с числовыми данными, которые хранятся в виде строк, как например ZIP-коды, коды товаров или другие форматированные числа. В этой статье мы рассмотрим несколько методов для удаления ведущих нулей в SQL Server.

Метод 1: использование функций CAST и CONVERT


Одним простым способом удаления ведущих нулей является преобразование строки в число, а затем обратно в строку. Этот подход хорошо работает, если вы знаете, что строка содержит только числовые символы.
Continue reading "Удаление ведущих нулей в SQL Server"

Добавьте индексы, чтобы улучшить производительность SQL DELETE

Пересказ статьи Jared Westover. Add Indexes to Improve SQL DELETE Performance


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

В этой статье мы исследуем важность индексов в улучшении операторов DELETE. Кроме того, многие разработчики полагают, что добавление внешнего ключа создает индекс, а это значит, что они обычно отсутствуют. Как можно определить, какие внешние ключи пропускают индексы? Не беспокойтесь, полезная DMV поможет обнаружить их. Начиная с сегодняшнего дня вы приобретете навыки ускорять ваши операторы DELETE.
Continue reading "Добавьте индексы, чтобы улучшить производительность SQL DELETE"

Может ли ИИ читать планы выполнения?

Пересказ статьи Grant Fritchey. Can AI Read Execution Plans?


Да, да, вторая статья об ИИ подряд. Я обещаю, что это не станет привычкой. Но я видел, что кто-то еще упомянул, что вы можете подать XML, и ИИ прочитает план выполнения. Я должен был протестировать это, а затем поделиться результатами с вами.
Continue reading "Может ли ИИ читать планы выполнения?"

Неделя SQL: поразрядное маскирование и побитовые операции

Пересказ статьи Lorenzo Uriel. The SQL Week: Bitmasking & Bitwise


Поразрядное маскирование (Bitmasking) и побитовые (Bitwise) операции являются понятиями, используемыми главным образом в программировании для манипуляции и представления данных и объектов на уровне битов, позволяя эффективно их обрабатывать.

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

Это делается с помощью побитовых операторов, таких как AND (&), OR (|), XOR (^), NOT (~) и других. Битовые маски используются для определения того, какие биты числа будут модифицироваться, тестироваться или включаться.
Continue reading "Неделя SQL: поразрядное маскирование и побитовые операции"

Изучение планов выполнения оконных функций

Пересказ статьи Grant Fritchey. Exploring Window Functions Execution Plans


Есть совсем немного разных способов, с помощью которых вы, вероятно, могли увидеть, как оконные функции проявляют себя в плане выполнения. Давайте рассмотрим один пример.

Оконные функции


Для нашего примера я возьму довольно простой запрос:

SELECT soh.CustomerID,
soh.SubTotal,
ROW_NUMBER() OVER (PARTITION BY soh.CustomerID ORDER BY soh.OrderDate ASC) AS RowNum,
Soh.OrderDate
FROM Sales.SalesOrderHeader AS soh
WHERE soh.OrderDate
BETWEEN '1/1/2013' AND '7/1/2013'
ORDER BY RowNum DESC, soh.OrderDate;

Ничего необычного. Какой план будет сгенерирован? Вот план с метриками времени выполнения (т.е. действительный план):


Continue reading "Изучение планов выполнения оконных функций"

Как переименовать столбец в SQL Server

Пересказ статьи Nisarg Upadhyay. How to Rename a Column in SQL Server


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

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

Эта статья посвящена основам переименования столбцов с помощью хранимой процедуры sp_rename. Также я объясняю, как переименовать столбец, используя SQL Server Management Studio. Сначала давайте разберемся с основами переименования столбца.
Continue reading "Как переименовать столбец в SQL Server"

TRY CATCH, RAISERROR и THROW для обработки ошибок в SQL Server

Пересказ статьи Joydip Kanjilal. SQL Server TRY CATCH, RAISERROR and THROW for Error Handling


Ошибки в приложениях SQL Server могут возникать по разным причинам, таким как ошибочные данные, несогласованность данных, сбой системы или других ошибок. Здесь мы разберем, как обрабатывать ошибки в SQL Server при помощи TRY…CATCH, RAISERROR и THROW.

Логика T-SQL позволяет обрабатывать ошибки в SQL Server разными способами, такими как блоки TRY…CATCH, операторы RAISERROR и THROW. Каждый вариант имеет свои достоинства и недостатки. Давайте рассмотрим примеры для каждого варианта. Continue reading "TRY CATCH, RAISERROR и THROW для обработки ошибок в SQL Server"

Эффективные стратегии хранения и парсинга XML в SQL Server

Пересказ статьи Edward Pollack. Effective Strategies for Storing and Parsing XML in SQL Server


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

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

В этой статье рассматриваются различные распространенные проблемы, связанные с XML, и функциональность, которой обладает SQL Server, чтобы максимально упростить решение этих проблем.
Continue reading "Эффективные стратегии хранения и парсинга XML в SQL Server"