Пересказ статьи 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"
Пересказ статьи Lorenzo Uriel. The SQL Week: Data Modeling
Наличие хорошей документации и четко определенного процесса сделают вас более способными что-то создавать и внедрять.
Одним из наиболее любимых мной процессов является моделирование данных.
Итак, из чего состоит процесс моделирования?
Можно упомянуть:
1. Анализ требований
2. Концептуальная модель (ERD - ERM)
3. Логическая модель (таблицы и связи)
4. Физическая модель (создание таблиц в базе данных)
Это будут пункты этой части, в результате которой я хочу построить с вами реальный пример с нуля.
Continue reading "Неделя SQL: моделирование данных"
Пересказ статьи 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"