Поделиться через


Указания на присоединение (Transact-SQL)

Область применения:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureКонечная точка аналитики SQL в Microsoft FabricХранилище в Microsoft FabricБаза данных SQL в Microsoft Fabric

Указания на присоединение указывают, что оптимизатор запросов применяет стратегию соединения между двумя таблицами в SQL Server. Общие сведения о синтаксисе соединения и соединения см . в предложении FROM и JOIN, APPLY, PIVOT.

Внимание

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

Применяется к

Соглашения о синтаксисе Transact-SQL

Синтаксис

<join_hint> ::=
     { LOOP | HASH | MERGE | REMOTE | REDUCE | REPLICATE | REDISTRIBUTE [(columns count)]}

Аргументы

{ LOOP | ХЭШ | MERGE }

применимо: База данных SQL Azure, Управляемый экземпляр SQL Azure, конечная точка аналитики SQL, база данных SQL в Microsoft Fabric, хранилище Microsoft Fabric

Задает использование циклов, хэша и операций объединения при соединении в запросе. Использование LOOPили HASHMERGE JOIN принудительное соединение между двумя таблицами. LOOP нельзя указывать вместе с RIGHT типом соединения или FULL как тип соединения. Дополнительные сведения см. в статье о соединениях.

REMOTE

применимо к: Базе данных SQL Azure, Управляемому экземпляру SQL Azure, конечной точке аналитики SQL, базе данных SQL в Microsoft Fabric

Задает, что операция соединения проводится на сайте в таблице, расположенной справа. Данный аргумент удобно использовать в случае, когда таблица, расположенная слева, является локальной, а справа располагается удаленная таблица. REMOTE следует использовать только в том случае, если в левой таблице меньше строк, чем в правой таблице.

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

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

REMOTE можно использовать только для INNER JOIN операций.

уменьшить

применимо к: Azure Synapse Analytics and Analytics Platform System (PDW)

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

ПОВТОРЯТЬ

применимо к: Azure Synapse Analytics, система платформы аналитики (PDW), хранилище Microsoft Fabric

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

  • Используя REPLICATE с соединением INNER или LEFT, операция перемещения трансляции реплицирует правую сторону соединения ко всем узлам.
  • Аналогичным образом при использовании REPLICATE с соединением RIGHT операция перемещения широковещательной передачи реплицирует левую сторону соединения ко всем узлам.
  • При использовании REPLICATE с соединением FULL невозможно создать предполагаемый план.

РАСПРОСТРАНЕНИЕ [(columns_count)]

применимо к: Azure Synapse Analytics and Analytics Platform System (PDW)

Принудительно распространяет два источника данных на столбцы, указанные в предложении JOIN. Для распределенной таблицы система платформы Аналитики (PDW) выполняет перемешив перемещение по первому столбцу обеих таблиц для реплицированной таблицы, система платформы Аналитики (PDW) выполняет обрезку. Сведения об этих типах перемещения см. в разделе "Операции плана запросов DMS" статьи "Общие сведения о планах запросов" в документации по продукту системы платформы аналитики (PDW). Это указание может повысить производительность в случае, когда план запроса использует широковещательное перемещение для разрешения несовместимого соединения распределения.

применимо к: хранилище Microsoft Fabric

Указание REDISTRIBUTE гарантирует, что два источника данных распределены на основе столбцов предложений JOIN. Он обрабатывает несколько условий соединения, указанных первым n столбцов в обеих таблицах, где n является аргументом column_count. Распространение данных оптимизирует производительность запросов, равномерно распределяя данные между узлами во время промежуточных шагов выполнения.

Аргумент (columns_count) поддерживается только в хранилище Microsoft Fabric.

Замечания

Указания на присоединение указываются в FROM предложении запроса. Указания по соединению принудительно активируют стратегию соединения между двумя таблицами. Если указание соединения указано для всех двух таблиц, оптимизатор запросов автоматически применяет порядок соединения для всех присоединенных таблиц в запросе на основе позиции ON ключевых слов. CROSS JOIN При использовании без ON предложения скобки можно использовать для указания порядка соединения.

Примеры

Примеры кода в этой статье используют базу данных образца AdventureWorks2022 или AdventureWorksDW2022, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.

А. Использование HASH

В следующем примере операция JOIN в запросе выполняется с помощью соединения HASH.

SELECT p.Name,
    pr.ProductReviewID
FROM Production.Product AS p
LEFT OUTER HASH JOIN Production.ProductReview AS pr
    ON p.ProductID = pr.ProductID
ORDER BY ProductReviewID DESC;

B. Использование ЦИКЛА

В следующем примере операция JOIN в запросе выполняется с помощью соединения LOOP.

DELETE
FROM Sales.SalesPersonQuotaHistory
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER LOOP JOIN Sales.SalesPerson AS sp
    ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO

В. Использование MERGE

В следующем примере операция JOIN в запросе выполняется с помощью соединения MERGE.

SELECT poh.PurchaseOrderID,
    poh.OrderDate,
    pod.ProductID,
    pod.DueDate,
    poh.VendorID
FROM Purchasing.PurchaseOrderHeader AS poh
INNER MERGE JOIN Purchasing.PurchaseOrderDetail AS pod
    ON poh.PurchaseOrderID = pod.PurchaseOrderID;
GO

Д. Пример указания соединения REDUCE

В следующем примере используется указание соединения REDUCE для изменения обработки производной таблицы в запросе. При использовании указания соединения REDUCE в этом запросе выполняется проецирование, репликация и разделение fis.ProductKey и последующее соединение с DimProduct во время случайного перемещения DimProduct в ProductKey. Результирующая производная таблица распространяется на fis.ProductKey.

-- Uses AdventureWorks
  
SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REDUCE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

Е. Пример указания соединения REPLICATE

В следующем примере показан тот же запрос, что и в предыдущем примере, за исключением того, что вместо указания соединения REPLICATE используется указание соединения REDUCE. Использование указания REPLICATE приводит к репликации значений в столбце соединения ProductKey из таблицы FactInternetSalesна всех узлах. Таблица DimProduct соединяется с реплицированной версией этих значений.

-- Uses AdventureWorks

SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REPLICATE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

F. Используйте указание DISTRIBUTIONE, чтобы гарантировать перемещение shuffle для несовместимого соединения распределения

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

В следующем примере указание REDISTRIBUTE заставляет перемещение shuffle в таблицу FactInternetSales, так как ProductKey является столбцом распространения для DimProduct, и не является столбцом распространения для FactInternetSales.

-- Uses AdventureWorks
  
SELECT dp.ProductKey,
    fis.SalesOrderNumber,
    fis.TotalProductCost
FROM DimProduct AS dp
INNER REDISTRIBUTE JOIN FactInternetSales AS fis
    ON dp.ProductKey = fis.ProductKey;

G. Использование аргумента счетчика столбцов с указанием REDISTRIBUTE

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

SELECT * FROM DA
INNER REDISTRIBUTE (4) JOIN DB
ON DA.a1 = DB.b1