Пересказ статьи Erik Darling. The How To Write SQL Server Queries Correctly Cheat Sheet Conditional Join and Where Clauses
Так или иначе
Оператор OR вполне легитимно может использоваться в операторах SQL. Если вы используете предложение IN, велика вероятность, что оптимизатор преобразует его в последовательность операторов OR.
Например, IN(1, 2, 3) может в результате стать = 1 OR = 2 OR = 3 без вашего участия. Оптимизаторы так забавляются. Забавные маленькие кролики.
Проблема обычно возникает не тогда, когда вы пишете в запросе IN или OR для одного столбца со списком литеральных значений, а когда вы:
- Используете OR по множеству столбцов в предложении WHERE.
- Используете OR в предложении JOIN любого сорта.
- Используете OR для обработки параметров или переменных NULL.
Добавьте немного сложности, объединив две таблицы и попросив что-то вроде:
Continue reading "Шпаргалка по правильному написанию запросов к SQL Server: условное соединение и предложение WHERE"
Пересказ статьи Prakash K. Unlocking Power with Updatable Views in SQL Server
Реляционные системы управления базами данных (РСУБД) основаны на структурированном языке запросов (SQL) в плане управления и манипуляции данными. Представления в SQL Server предоставляют эффективный способ абстрагироваться от лежащих в основании сложных структур данных. В то время как многие представления доступны только на чтение, обновляемые представления открывают дверь к динамической манипуляции данными с помощью операций INSERT, UPDATE и DELETE. В этом руководстве мы познакомимся с понятием обновляемых представлений в SQL Server, исследуем операции с ними и дадим полезный пример.
Понятие обновляемого представления
Обновляемое представление в SQL Server - это представление, которое допускает модификацию, т.е. применение таких операторов, как INSERT, UPDATE или DELETE к таблицам через представление. Чтобы сделать представление обновляемым, оно должно удовлетворять нижеприведенным критериям.
Continue reading "Раскройте силу обновляемых представлений в SQL Server"
В SQL Server 2022 появилась функция генерации числовой последовательности, GENERATE_SERIES. Подобная функция имеется в некоторых других СУБД, в частности, в PostgreSQL. Вот, например, как с помощью этой функции решалась
следующая задача из учебника.
Вывести последовательность дат между датами первого и последнего полета пассажира с id_psg = 5.
Решение:
SELECT generate_series(MIN(date), MAX(date), '1 day')
FROM pass_in_trip
WHERE id_psg = 5;
Continue reading "GENERATE_SERIES в SQL Server"
Пересказ статьи Andy Brownsword. Solving Parameter Sniffing with Multiple Execution Plans
Динамический SQL имеет много вариантов использования, и один из них может помочь нам разрешить проблемы прослушивания параметра (Parameter Sniffing). Здесь мы рассмотрим как он может использоваться для генерации
нескольких планов выполнения для одного и того же запроса.
Прослушивание параметра является общеизвестной проблемой. Даже для простых запросов мы можем столкнуться с получением неоптимального плана. Имеется несколько способов с применением динамического SQL, которые мы можем использовать для решения этой проблемы. Тут мы продемонстрируем один из них: инъекция комментария.
Давайте начнем с процедуры и индекса в базе данных StackOverflow:
CREATE OR ALTER PROCEDURE dbo.GetPopularUsers (
@MinimumViews INT
) AS
BEGIN
SELECT Id, DisplayName
FROM dbo.Users
WHERE [Views] >= @MinimumViews;
END
GO
CREATE INDEX [Views]
ON dbo.Users ([Views]);
Continue reading "Решение проблемы прослушивания параметра при помощи нескольких планов выполнения"
Пересказ статьи Erik Darling. The How To Write SQL Server Queries Correctly Cheat Sheet: Cross Apply And Outer Apply
Ситуации
В конечном счете я преобразую множество производных соединений, особенно тех, которые используют оконные функции, к использованию синтаксиса APPLY. Иногда для этого существуют хорошие индексы, в других случаях необходимо их создавать, чтобы избежать
"Жадного спула индексов".
Одним из наиболее частых вопросов, которые я получаю от разработчиков, является вопрос о том, когда следует использовать apply, а не другой синтаксис соединения.
Короткий ответ заключается в том, что я начинаю мысленно представлять себе, как синтаксис apply может быть полезен, когда:
- Имеется небольшая внешняя таблица (FROM) и большая внутренняя таблица (APPLY).
- Мне требуется выполнить значительный объем работы на внутренней стороне соединения.
- Целью запроса является получение top N на группу или что-то подобное.
- Я пытаюсь получить параллельные вложенные циклы вместо выбора некоторого альтернативного плана.
- Чтобы заменить скалярную UDF в списке select на встроенную (inline) UDF.
- Чтобы использовать конструкцию VALUES необычным способом.
Большинство этого ситуативно и требует немного опыта и знакомства, чтобы быстро это заметить.
Continue reading "Шпаргалка по правильному написанию запросов к SQL Server: Cross Apply и Outer Apply"