Udostępnij za pośrednictwem


Wskazówki dotyczące sprzężenia (Transact-SQL)

Dotyczy:SQL ServerAzure SQL Databasepunkt końcowy analizy SQL w Microsoft FabricInstancja zarządzana SQL w Microsoft FabricMagazyn w Microsoft FabricBaza danych SQL w Microsoft Fabric

Wskazówki sprzężenia określają, że optymalizator zapytań wymusza strategię sprzężenia między dwiema tabelami w programie SQL Server. Aby uzyskać ogólne informacje na temat składni sprzężeń i sprzężeń, zobacz klauzuli FROM oraz JOIN, APPLY, PIVOT.

Ostrożność

Ponieważ optymalizator zapytań programu SQL Server zazwyczaj wybiera najlepszy plan wykonania zapytania, zalecamy, aby wskazówki były używane tylko jako ostateczność dla doświadczonych deweloperów i administratorów baz danych.

Odnosi się do

Transact-SQL konwencje składni

Składnia

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

Argumenty (w programowaniu)

{ PĘTLA | Skrót skrótu | MERGE }

Dotyczy: Azure SQL Database, Azure SQL Managed Instance, punkt końcowy analizy SQL, baza danych SQL w usłudze Microsoft Fabric, Microsoft Fabric Warehouse

Określa, że sprzężenie w zapytaniu powinno używać pętli, tworzenia skrótów lub scalania. Użycie LOOP, HASHlub MERGE JOIN wymusza określone sprzężenia między dwiema tabelami. LOOP nie można określić razem z RIGHT lub FULL jako typ sprzężenia. Aby uzyskać więcej informacji, zobacz Joins (Sprzężenia).

ZDALNY

Dotyczy: Azure SQL Database, Azure SQL Managed Instance, punkt końcowy analizy SQL, baza danych SQL w usłudze Microsoft Fabric

Określa, że operacja sprzężenia jest wykonywana w lokacji prawej tabeli. Jest to przydatne, gdy lewa tabela jest tabelą lokalną, a prawa tabela jest tabelą zdalną. REMOTE należy używać tylko wtedy, gdy lewa tabela ma mniej wierszy niż prawa tabela.

Jeśli właściwa tabela jest lokalna, sprzężenia są wykonywane lokalnie. Jeśli obie tabele są zdalne, ale z różnych źródeł danych, REMOTE powoduje wykonanie sprzężenia w lokacji właściwej tabeli. Jeśli obie tabele są tabelami zdalnymi z tego samego źródła danych, REMOTE nie jest wymagana.

REMOTE nie można użyć, gdy jedna z wartości porównywanych w predykacie sprzężenia jest rzutowana do innego sortowania przy użyciu klauzuli COLLATE.

REMOTE można używać tylko w przypadku operacji INNER JOIN.

ZMNIEJSZYĆ

Dotyczy: Azure Synapse Analytics and Analytics Platform System (PDW)

Zmniejsza liczbę wierszy do przeniesienia dla tabeli po prawej stronie sprzężenia w celu zapewnienia zgodności dwóch rozkładów niezgodnych tabel. Wskazówka REDUCE jest również nazywana wskazówką półsprzężenia.

REPLIKOWAĆ

Dotyczy: Azure Synapse Analytics, Analytics Platform System (PDW), Microsoft Fabric Warehouse

Powoduje operację przenoszenia emisji, w której należy replikować określoną tabelę we wszystkich węzłach dystrybucji.

  • Przy użyciu REPLICATE z sprzężeniami INNER lub LEFT operacja przenoszenia emisji zreplikuje prawą stronę sprzężenia do wszystkich węzłów.
  • Podobnie podczas korzystania z REPLICATE z sprzężenia RIGHT operacja przenoszenia emisji zreplikuje lewą stronę sprzężenia do wszystkich węzłów.
  • W przypadku korzystania z REPLICATE z sprzężeniami FULL nie można utworzyć szacowanego planu.

REDYSTRYBUCJA [(columns_count)]

Dotyczy: Azure Synapse Analytics and Analytics Platform System (PDW)

Wymusza dystrybucję dwóch źródeł danych na kolumnach określonych w klauzuli JOIN. W przypadku tabeli rozproszonej system platformy analizy (PDW) wykonuje przenoszenie mieszania w pierwszej kolumnie obu tabel W przypadku tabeli replikowanej system platformy analizy (PDW) wykonuje przenoszenie przycinania. Aby zrozumieć te typy przenoszenia, zobacz sekcję "Operacje planu zapytań DMS" w artykule "Understanding Query Plans" (Opis planów zapytań) w dokumentacji produktu Analytics Platform System (PDW). Ta wskazówka może zwiększyć wydajność, gdy plan zapytania korzysta z przenoszenia emisji w celu rozwiązania niezgodnego sprzężenia dystrybucji.

Dotyczy: Microsoft Fabric Warehouse

Wskazówka REDISTRIBUTE zapewnia dystrybucję dwóch źródeł danych na podstawie kolumn klauzuli JOIN. Obsługuje wiele warunków sprzężenia określonych przez pierwsze kolumny n w obu tabelach, gdzie n jest argumentem column_count. Ponowne dystrybuowanie danych optymalizuje wydajność zapytań przez równomierne rozłożenie danych między węzłami podczas pośrednich kroków wykonywania.

Argument (columns_count) jest obsługiwany tylko w usłudze Microsoft Fabric Warehouse.

Uwagi

Wskazówki sprzężenia są określone w klauzuli FROM zapytania. Wskazówki sprzężenia wymuszają strategię sprzężenia między dwiema tabelami. Jeśli dla dwóch tabel określono wskazówkę sprzężenia, optymalizator zapytań automatycznie wymusza kolejność sprzężenia dla wszystkich tabel sprzężonych w zapytaniu na podstawie położenia słów kluczowych ON. Jeśli CROSS JOIN jest używana bez klauzuli ON, nawiasy mogą służyć do wskazania kolejności sprzężenia.

Przykłady

Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2022 lub AdventureWorksDW2022, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.

A. Korzystanie z funkcji HASH

Poniższy przykład określa, że operacja JOIN w zapytaniu jest wykonywana przez sprzężenia 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. Korzystanie z pętli

Poniższy przykład określa, że operacja JOIN w zapytaniu jest wykonywana przez sprzężenia 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

C. Korzystanie z funkcji MERGE

Poniższy przykład określa, że operacja JOIN w zapytaniu jest wykonywana przez sprzężenia 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

D. Przykład wskazówki dotyczącej sprzężenia REDUKCJI

W poniższym przykładzie użyto wskazówki REDUCE sprzężenia w celu zmiany przetwarzania tabeli pochodnej w zapytaniu. W przypadku korzystania z wskazówki REDUCE sprzężenia w tym zapytaniu fis.ProductKey jest projektowana, replikowana i unikatowa, a następnie przyłączona do DimProduct podczas mieszania DimProduct w ProductKey. Wynikowa tabela pochodna jest dystrybuowana na 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;

E. Przykład wskazówki dotyczącej sprzężenia REPLIK

W następnym przykładzie pokazano to samo zapytanie co w poprzednim przykładzie, z tą różnicą, że użyto wskazówki REPLICATE sprzężenia zamiast wskazówki REDUCE sprzężenia. Użycie wskazówki REPLICATE powoduje replikowanie wartości w kolumnie ProductKey (sprzęganie) z tabeli FactInternetSales do wszystkich węzłów. Tabela DimProduct jest przyłączona do replikowanej wersji tych wartości.

-- 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. Użyj wskazówki redystrybucji, aby zagwarantować przenoszenie mieszania dla niezgodnego sprzężenia dystrybucji

Poniższe zapytanie używa wskazówki REDISTRIBUTE zapytania dotyczącego niezgodnego sprzężenia dystrybucji. Gwarantuje to, że optymalizator zapytań korzysta z przenoszenia mieszania w planie zapytania. Gwarantuje to również, że plan zapytania nie będzie używać przenoszenia emisji, który przenosi tabelę rozproszoną do zreplikowanej tabeli.

W poniższym przykładzie wskazówka REDISTRIBUTE wymusza przejście shuffle w tabeli FactInternetSales, ponieważ ProductKey jest kolumną dystrybucji dla DimProducti nie jest kolumną rozkładu dla 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. Użyj argumentu count kolumn z wskazówką REDISTRIBUTE

Poniższe zapytanie używa wskazówek zapytania REDISTRIBUTE z argumentem liczby kolumn, a przetasowania odbywa się w pierwszych czterech kolumnach każdej tabeli w sprzężeniu.

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