Поиск…


СОВЕТЫ СОВЕТОВ

Когда вы присоединяетесь к двум таблицам, оптимизатор запросов SQL Server (QO) может выбирать разные типы соединений, которые будут использоваться в запросе:

  • Подключение HASH
  • Соединение LOOP
  • Присоединение MERGE

QO исследует планы и выбирает оптимального оператора для объединения таблиц. Однако, если вы уверены, что знаете, что будет оптимальным оператором объединения, вы можете указать, какой тип JOIN следует использовать. Внутреннее объединение LOOP заставит QO выбрать объединение вложенных циклов при соединении двух таблиц:

select top 100 *
from Sales.Orders o 
    inner loop join Sales.OrderLines ol 
    on o.OrderID = ol.OrderID

внутреннее объединение слияния приведет к соединению MERGE:

select top 100 *
from Sales.Orders o 
    inner merge join Sales.OrderLines ol 
    on o.OrderID = ol.OrderID

внутреннее хеш-соединение заставит оператор HASH-соединения:

select top 100 *
from Sales.Orders o 
    inner hash join Sales.OrderLines ol 
    on o.OrderID = ol.OrderID

ГРУППА ПО СОВЕТОМ

Когда вы используете предложение GROUP BY, оптимизатор запросов SQL Server (QO) может выбирать различные типы операторов группировки:

  • HASH Aggregate, создающий хэш-карту для группировки записей
  • Stream Aggregate, который хорошо работает с заранее заказанными входами

Вы можете явно потребовать, чтобы QO выбирает тот или иной агрегированный оператор, если вы знаете, что было бы оптимальным. С помощью OPTION (ORDER GROUP) QO всегда будет выбирать агрегат Stream и добавить оператор Sort перед агрегатом Stream, если вход не отсортирован:

select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (ORDER GROUP) 

С помощью OPTION (HASH GROUP) QO всегда будет выбирать агрегат Hash:

select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (HASH GROUP) 

Подсказка FAST rows

Указывает, что запрос оптимизирован для быстрого извлечения первого number_rows. Это неотрицательное целое число. После того, как будут возвращены первые number_rows, запрос продолжит выполнение и даст полный набор результатов.

select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (FAST 20) 

Советы UNION

Когда вы используете оператор UNION для двух результатов запроса, оптимизатор запросов (QO) может использовать следующие операторы для создания объединения двух наборов результатов:

  • Объединение (Союз)
  • Конкат (Союз)
  • Hash Match (Союз)

Вы можете явно указать, какой оператор следует использовать с помощью подсказки OPTION ():

select OrderID, OrderDate, ExpectedDeliveryDate, Comments
from Sales.Orders
where OrderDate > DATEADD(day, -1, getdate())
UNION
select PurchaseOrderID as OrderID, OrderDate, ExpectedDeliveryDate, Comments
from Purchasing.PurchaseOrders
where OrderDate > DATEADD(day, -1, getdate())
OPTION(HASH UNION)
-- or OPTION(CONCAT UNION)
-- or OPTION(MERGE UNION)

Опция MAXDOP

Указывает максимальную степень параллелизма для запроса с указанием этой опции.

SELECT OrderID,
    AVG(Quantity)
FROM Sales.OrderLines
GROUP BY OrderID
OPTION (MAXDOP 2);

Этот параметр переопределяет параметр конфигурации MAXDOP для sp_configure и Resource Governor. Если MAXDOP установлен на ноль, сервер выбирает максимальную степень параллелизма.

Подсказки INDEX

Индексные подсказки используются, чтобы заставить запрос использовать определенный индекс, вместо того, чтобы позволить оптимизатору запросов SQL Server выбирать то, что он считает лучшим индексом. В некоторых случаях вы можете получить преимущества, указав индекс, который должен использовать запрос. Обычно SQL Server Query Optimizer выбирает лучший индекс, подходящий для запроса, но из-за отсутствия / устаревших статистических данных или особых потребностей вы можете заставить его.

SELECT *
FROM mytable WITH (INDEX (ix_date))
WHERE field1 > 0
    AND CreationDate > '20170101'


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow