Skip to content

Шпаргалка по правильному написанию запросов к SQL server: EXISTS и NOT EXISTS

Пересказ статьи Erik Darling. The How To Write SQL Server Queries Correctly Cheat Sheet: EXISTS and NOT EXISTS


Замечательная вещь, связанная с SQL, состоит в том, что имеется много директив, которые довольно легко понять и использовать по назначению.

Ужасная вещь, относящаяся к SQL, заключается в том, что в нем столько же правил, которые применяются избирательно, как и в самом английском языке.

У меня, конечно, есть свои жалобы и недовольство относительно выбора некоторых из них, и вы тоже в этом убедитесь, когда глубже вникните в язык. Типичным примером этого типа является мое желание использовать в SQL GET вместо SELECT для извлечения данных.

Очень немного людей идут в магазин выбирать (select) молоко, яйца, масло, соль, перец и виски. Большинство из нас просто идет взять (get) их. Но хватит о завтраке.

Давайте поговорим о двух наиболее часто упускаемых из виду и недооцененных возможностях в языке SQL: EXISTS и NOT EXISTS. Возможно, они бы больше привлекали внимание, если бы назывались THERE and NOT THERE, но тогда была бы опасность начального затруднения с предложениями WHERE и THERE.

Часто очерняемые теми, кто читал статью в 1998 о "подзапросах в MySQL, которые медленнее, чем соединения", эти предикаты являются двумя наиболее полезными вещами, которые вы можете освоить и использовать регулярно.

Хотя они несколько напоминают подзапросы, столбцы, которые вы выбираете в подзапросе EXISTS или NOT EXISTS не могут использоваться во внешнем запросе. Вы можете поместить что угодно в список SELECT, от * или 1 до COUNT или 1/0, или всего содержимого Библии короля Якова, и это никогда не приведет ни к каким даже самым незначительным изменениям в мире. Аналогично, добавление DISTINCT, TOP или любого другого ограничителя числа строк не сделает ничего такого, чтобы изменить план запроса или его производительность.

Преодолейте себя.

И EXISTS, и NOT EXISTS уже установили число строк в 1, поскольку все, что нужно сделать каждому из них, это определить, существует хотя бы одна строка или нет, и наоборот.
Continue reading "Шпаргалка по правильному написанию запросов к SQL server: EXISTS и NOT EXISTS"

Индексация запросов SQL Server для производительности: исправление оконных функций

Пересказ статьи Erik Darling. Indexing SQL Server Queries For Performance: Fixing Windowing Functions


Ответом на проблемы производительности, связанные с ранжирующими оконными функциями, почти всегда было предложение просто включить пакетный режим (Batch Mode). Там, где это невозможно, вы могли прибегнуть к добавлению индексов.

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

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

Я хочу вам показать ограниченность индексирования для решения проблем производительности ранжирующих оконных функций в построчном режиме (Row Mode). Это особенно болезненно для разработчиков, вынужденных использовать Standard Edition, где пакетный режим безнадежно канул в Лету.

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

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

Вот несколько примеров: Continue reading "Индексация запросов SQL Server для производительности: исправление оконных функций"

Имеет ли значение порядок в GROUP BY?

Пересказ статьи Brent Ozar. Does Your GROUP BY Order Matter?


Иногда, когда вы используете GROUP BY, порядок столбцов имеет значение. Например, эти два запроса SELECT дают разные результаты:

CREATE INDEX Location_DisplayName
ON dbo.Users(Location, DisplayName);

SELECT TOP 100 Location, DisplayName, COUNT(*) AS Duplicates
FROM dbo.Users
GROUP BY Location, DisplayName
ORDER BY Location, DisplayName;

SELECT TOP 100 DisplayName, Location, COUNT(*) AS Duplicates
FROM dbo.Users
GROUP BY DisplayName, Location
ORDER BY DisplayName, Location;

Их действительные планы выполнения существенно разнятся:

Continue reading "Имеет ли значение порядок в GROUP BY?"