- 20.08.2019
- 25 minut na przeczytanie
-
- X
- c
- j
- r
- a
-
+18
Dotyczy: SQL Server (wszystkie obsługiwane wersje) Azure SQL Database Azure Synapse Analytics
Uruchamia operacje wstawiania, aktualizowania lub usuwania w tabeli docelowej z wyniki łączenia z tabelą źródłową. Na przykład zsynchronizuj dwie tabele, wstawiając, aktualizując lub usuwając wiersze w jednej tabeli na podstawie różnic znalezionych w drugiej tabeli.
Uwaga
MERGE jest obecnie w podglądzie dla Azure Synapse Analytics.
Porada dotycząca wydajności: zachowanie warunkowe opisane dla instrukcji MERGE działa najlepiej, gdy dwie tabele mają złożoną mieszankę pasujących cech. Na przykład wstawianie wiersza, jeśli nie istnieje, lub aktualizowanie wiersza, jeśli jest zgodny. Po prostu aktualizując jedną tabelę na podstawie wierszy innej tabeli, popraw wydajność i skalowalność za pomocą podstawowych instrukcji INSERT, UPDATE i DELETE. przykład:
Konwencje składni języka Transact-SQL
Składnia
Uwaga
Aby wyświetlić składnię języka Transact-SQL dla SQL Server 2014 i wcześniejszych, zobacz dokumentację poprzednich wersji.
Argumenty
WITH < common_table_expression >
Określa tymczasowo nazwany zestaw wyników lub widok, znany również jako wspólne wyrażenie tabelowe, który jest zdefiniowany w zakresie oświadczenia MERGE. Zestaw wyników pochodzi z prostego zapytania i odwołuje się do niego instrukcja MERGE. Aby uzyskać więcej informacji, zobacz WITH common_table_expression (Transact-SQL).
TOP (wyrażenie)
Określa liczbę lub procent wierszy, na które ma to wpływ. wyrażenie może być liczbą lub procentem wierszy. Wiersze, do których odwołuje się wyrażenie TOP, nie są ułożone w żadnej kolejności. Aby uzyskać więcej informacji, zobacz TOP (Transact-SQL).
Klauzula TOP ma zastosowanie po całej tabeli źródłowej i połączeniu całej tabeli docelowej oraz połączonych wierszach, które nie kwalifikują się do wstawiania, aktualizowania lub usuwanie jest usuwane. Klauzula TOP dodatkowo zmniejsza liczbę połączonych wierszy do określonej wartości. Akcje wstawiania, aktualizowania lub usuwania mają zastosowanie do pozostałych połączonych wierszy w sposób nieuporządkowany. Oznacza to, że nie ma kolejności, w której wiersze są rozdzielane między akcje zdefiniowane w klauzulach WHEN. Na przykład określenie TOP (10) wpływa na 10 wierszy. Z tych wierszy 7 można zaktualizować, a 3 wstawić lub 1 usunąć, 5 zaktualizować, 4 wstawić itd.
Ponieważ instrukcja MERGE wykonuje pełne skanowanie tabeli zarówno źródła, jak i tabele docelowe, użycie klauzuli TOP w celu zmodyfikowania dużej tabeli przez utworzenie wielu partii ma czasami wpływ na wydajność operacji we / wy. W tym scenariuszu ważne jest, aby upewnić się, że wszystkie kolejne partie dotyczą nowych wierszy.
nazwa_bazy_danych
Nazwa bazy danych, w której znajduje się tabela_docelowa.
nazwa_schematu
Nazwa schematu, do którego należy target_table.
target_table
Tabela lub widok, w odniesieniu do którego wiersze danych z < table_source > są dopasowywane na podstawie < clause_search_condition >. target_table jest celem wszelkich operacji wstawiania, aktualizowania lub usuwania określone w klauzulach WHEN instrukcji MERGE.
Jeśli tabela target_table jest widokiem, wszelkie działania przeciwko niemu muszą spełniać warunki aktualizacji widoków. Aby uzyskać więcej informacji, zobacz Modyfikowanie danych za pomocą widoku.
tabela_celu nie może być tabelą zdalną. target_table nie może mieć zdefiniowanych żadnych reguł.
table_alias
Alternatywna nazwa odwołująca się do tabeli dla tabeli docelowej.
UŻYWANIE < table_source >
Określa źródło danych, które „jest dopasowane do wierszy danych w target_table na podstawie < warunku merge_search >. Wynik tego dopasowania dyktuje działania, które mają zostać podjęte przez klauzule WHEN instrukcji MERGE. < table_source > może być tabelą zdalną lub pochodną, która uzyskuje dostęp do tabel zdalnych.
< table_source > może być tabelą pochodną, która używa konstruktora wartości tabeli Transact-SQL do konstruowania tabeli przez określenie wielu wierszy.
alias_tabeli
Alternatywna nazwa odwołująca się do tabeli dla źródła_tabeli.
Aby uzyskać więcej informacji na temat składni i argumentów tej klauzuli, zobacz FROM (Transact-SQL).
ON < merge_search_condition >
Określa warunki, na których < table_source > łączy z target_table, aby określić, gdzie pasują.
Uwaga
Ważne jest, aby określić tylko kolumny z tabeli docelowej do wykorzystania w celu dopasowania. Oznacza to, że należy określić kolumny z tabeli docelowej, które są porównywane z odpowiednią kolumną tabeli źródłowej. Nie próbuj poprawiać wydajności zapytań przez odfiltrowywanie wierszy w tabeli docelowej w klauzula ON; na przykład, takie jak określenie AND NOT target_table.column_x = value
. Może to spowodować zwrócenie nieoczekiwanych i niepoprawnych wyników.
GDY DOPASOWANO TO < merge_matched >
Określa, że wszystkie wiersze * target_table, które są zgodne z wierszami zwróconymi przez < table_source > ON < merge_search_condition > i spełniają wszelkie dodatkowe warunki wyszukiwania, są aktualizowane lub usuwane zgodnie z < merge_matched >.
Instrukcja MERGE może zawierać najwyżej dwie klauzule WHEN MATCHED. Jeśli określono dwie klauzule, pierwszej musi towarzyszyć klauzula AND < search_condition >. Dla dowolnego wiersza druga klauzula WHEN MATCHED jest stosowana tylko wtedy, gdy pierwsza nie ma wartości „t. Jeśli są dwie klauzule WHEN MATCHED, należy określić akcję UPDATE i jedną z nich należy określić akcję DELETE. id = „fc8e8462b6″> merge_matched > klauzula i więcej niż jeden wiersz < table_source > pasuje do wiersza w target_table na podstawie < merge_search_condition >, SQL Server zwraca błąd. Instrukcja MERGE może” t aktualizuj ten sam wiersz więcej niż raz lub aktualizuj i usuwaj ten sam wiersz.
JEŚLI NIE DOPASOWANY, TO < merge_not_matched >
Określa, że wiersz jest wstawiany do target_table dla każdego wiersza zwracanego przez < table_source > ON < merge_search_condition >, który nie pasuje do wiersza w kierowaniu et_table, ale spełnia dodatkowy warunek wyszukiwania, jeśli występuje. Wartości do wstawienia są określone w klauzuli < merge_not_matched >. Instrukcja MERGE może mieć tylko jedną klauzulę WHEN NOT MATCHED.
JEŚLI NIE DOPASOWANE WEDŁUG ŹRÓDŁA, TO < merge_matched >
Określa, że wszystkie wiersze * target_table, które nie pasują do wierszy zwróconych przez < table_source > ON < merge_search_condition >, które spełniają wszelkie dodatkowe warunki wyszukiwania, są aktualizowane lub usuwane zgodnie z < merge_matched > klauzula.
Instrukcja MERGE może mieć najwyżej dwie klauzule WHEN NOT MATCHED BY SOURCE. Jeśli określono dwie klauzule, to pierwszej klauzuli musi towarzyszyć klauzula AND < clause_search_condition >. Dla dowolnego wiersza, druga klauzula WHEN NOT MATCHED BY SOURCE jest stosowana tylko wtedy, gdy pierwsza jest n ” t. Jeśli istnieją dwie klauzule WHEN NOT MATCHED BY SOURCE, należy określić akcję UPDATE i akcję DELETE. W < clause_search_condition > można odwoływać się tylko do kolumn z tabeli docelowej.
Gdy żadne wiersze nie są zwracane przez < table_source >, nie można uzyskać dostępu do kolumn w tabeli źródłowej. Jeśli aktualizacja lub operacja usunięcia określona w < merge_matched > klauzula odwołuje się do kolumn w tabeli źródłowej, zwracany jest błąd 207 (nieprawidłowa nazwa kolumny). Na przykład klauzula WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1
może spowodować niepowodzenie instrukcji, ponieważ Col1
w tabeli źródłowej jest niedostępne.
AND < clause_search_condition >
Określa dowolny prawidłowy warunek wyszukiwania. Aby uzyskać więcej informacji, zobacz Warunek wyszukiwania (Transact-SQL).
< table_hint_limited >
Określa co najmniej jedną wskazówkę dotyczącą tabeli docelowej dla każdej z e wstawianie, aktualizowanie lub usuwanie czynności wykonanych przez instrukcję MERGE. Słowo kluczowe WITH i nawiasy są wymagane.
NOLOCK i READUNCOMMITTED nie są dozwolone. Aby uzyskać więcej informacji na temat wskazówek dotyczących tabel, zobacz Wskazówki dotyczące tabel (Transact-SQL).
Określenie wskazówki TABLOCK w tabeli, która jest celem instrukcji INSERT, ma taki sam skutek, jak określenie wskazówki TABLOCKX. Tabela jest blokowana na wyłączność. Gdy określono FORCESEEK, ma ona zastosowanie do niejawna instancja tabeli docelowej połączona z tabelą źródłową.
Uwaga
Podanie polecenia READPAST z opcją WHEN NOT MATCHED THEN INSERT może skutkować operacjami INSERT, które naruszają ograniczenia UNIQUE.
INDEX (index_val)
Określa nazwę lub identyfikator jednego lub większej liczby indeksów w tabeli docelowej w celu wykonania niejawnego łączenia z tabelą źródłową. Aby uzyskać więcej informacji, zobacz Wskazówki dotyczące tabeli (Transact -SQL).
< output_clause >
Zwraca wiersz dla każdego wiersza w tabeli docelowej, która „s aktualizowane, wstawiane lub usuwane w dowolnej kolejności. $ action można określić w klauzuli wyjściowej. $ action to kolumna typu nvarchar (10), która zwraca jedną z trzech wartości dla każdego wiersza: „INSERT”, „UPDATE” lub „DELETE”, zgodnie z akcją wykonaną w tym wierszu. Aby uzyskać więcej informacji na temat argumentów i zachowania tej klauzuli, zobacz klauzulę OUTPUT (Transact-SQL).
< merge_matched >
Określa czynność aktualizacji lub usuwania, która jest stosowana do wszystkich wierszy tabeli target_table, które nie pasują do wierszy zwróconych przez < table_source > ON < merge_search_condition >, spełniające wszelkie dodatkowe warunki wyszukiwania.
UPDATE SET < set_clause >
Określa listę nazw kolumn lub zmiennych do zaktualizowania w tabeli docelowej oraz wartości, które mają zostać zaktualizowane.
Aby uzyskać więcej informacji na temat argumentów tej klauzuli, zobacz UPDATE (Transact-SQL). Ustawienie zmiennej na taką samą wartość jak w kolumnie nie jest obsługiwane.
DELETE
Określa, że wiersze pasujące do wierszy w tabeli target_table są usuwane.
< merge_not_matched >
Określa wartości do wstawienia do tabeli docelowej.
(column_list)
Lista jednej lub więcej kolumn tabeli docelowej, do których należy wstawić dane. Kolumny muszą być określone jako nazwy jednoczęściowe, w przeciwnym razie instrukcja MERGE nie powiedzie się. lista_kolumn musi być ujęta w nawiasy kwadratowe i oddzielona przecinkami.
WARTOŚCI ( values_list)
Lista oddzielonych przecinkami stałych, zmiennych lub wyrażeń zwracających wartości do wstawienia do tabeli docelowej. Wyrażenia nie mogą zawierać instrukcji EXECUTE.
DEFAULT VALUES
Wymusza wstawiony wiersz, aby zawierał wartości domyślne zdefiniowane dla każdej kolumny.
Aby uzyskać więcej informacji na temat tej klauzuli, zobacz INSERT (Transact-SQL).
< search_condition >
Speci spełnia warunki wyszukiwania, aby określić < merge_search_condition > lub < clause_search_condition >. Aby uzyskać więcej informacji na temat argumentów tej klauzuli, zobacz Warunek wyszukiwania (język Transact-SQL).
< wzorzec wyszukiwania wykresu >
Określa wzorzec dopasowania wykresu. Aby uzyskać więcej informacji na temat argumentów tej klauzuli, zobacz MATCH (Transact-SQL)
Uwagi
Uwaga
W usłudze Azure Synapse Analytics, MERGE polecenie (wersja zapoznawcza) ma następujące różnice w porównaniu z serwerem SQL i bazą danych Azure SQL.
- Aktualizacja MERGE jest implementowana jako para usuń i wstaw. Liczba wierszy, których dotyczy aktualizacja MERGE, obejmuje usunięte i wstawione wiersze.
- Podczas podglądu tabele z kolumną tożsamości nie są obsługiwane przez polecenie Synapse SQL MERGE.
- Obsługa tabele z różnymi typami dystrybucji są opisane w tej tabeli:
KLAUZULA MERGE w Azure Synapse Analytics Obsługiwana tabela dystrybucyjna TARGE Tabela dystrybucyjna obsługiwanego źródła Komentarz GDY DOPASOWANO Wszystkie typy dystrybucji Wszystkie typy dystrybucji NIE DOPASOWANY WEDŁUG CELU HASH Wszystkie typy dystrybucji Użyj UPDATE / DELETE FROM… JOIN, aby zsynchronizować dwie tabele. NIE DOPASOWANY WEDŁUG ŹRÓDŁA Wszystkie typy dystrybucji Wszystkie typy dystrybucji
Należy określić co najmniej jedną z trzech klauzul MATCHED, ale można je podać w dowolnej kolejności. Zmienna nie może być aktualizowana więcej niż raz w tej samej klauzuli MATCHED.
Wszelkie działania wstawiania, aktualizowania lub usuwania określone w tabeli docelowej przez instrukcję MERGE są ograniczone przez wszelkie ograniczenia zdefiniowane w niej, w tym wszelkie ograniczenia kaskadowej integralności referencyjnej. Jeśli IGNORE_DUP_KEY ma wartość ON dla wszelkich unikalnych indeksów w tabeli docelowej, MERGE ignoruje to ustawienie.
Instrukcja MERGE wymaga średnika (;) jako zakończenia instrukcji. Błąd 10713 jest wywoływany, gdy instrukcja MERGE jest uruchamiana bez terminatora.
W przypadku użycia po MERGE, @@ ROWCOUNT (Transact-SQL) zwraca klientowi całkowitą liczbę wstawionych, zaktualizowanych i usuniętych wierszy.
MERGE jest w pełni zastrzeżonym słowem kluczowym, gdy poziom zgodności bazy danych jest ustawiony na 100 lub wyższy. Instrukcja MERGE jest dostępna na poziomach zgodności baz danych 90 i 100; jednak słowo kluczowe nie jest w pełni zastrzeżone, gdy poziom zgodności bazy danych jest ustawiony na 90.
Nie używaj instrukcji MERGE podczas korzystania z replikacji aktualizującej w kolejce. MERGE i umieszczony w kolejce wyzwalacz aktualizacji nie są zgodne. Zastąp instrukcję MERGE instrukcją wstawiania lub aktualizacji.
Implementacja wyzwalacza
Dla każdej akcji wstawiania, aktualizowania lub usuwania określonej w instrukcji MERGE, SQL Server odpala wszystkie odpowiadające im wyzwalacze AFTER zdefiniowane w tabeli docelowej, ale nie gwarantuje, która akcja wyzwolić wyzwalacze jako pierwsza lub ostatnia. Wyzwalacze zdefiniowane dla tej samej akcji przestrzegają określonej przez Ciebie kolejności. Aby uzyskać więcej informacji na temat ustawiania kolejności wyzwalania wyzwalaczy, zobacz Określanie pierwszych i ostatnich wyzwalaczy.
Jeśli tabela docelowa ma zdefiniowany wyzwalacz INSTEAD OF dla operacji wstawiania, aktualizowania lub usuwania wykonywanej przez instrukcję MERGE , musi mieć włączony wyzwalacz INSTEAD OF dla wszystkich akcji określonych w instrukcji MERGE.
Jeśli jakiekolwiek wyzwalacze INSTEAD OF UPDATE lub INSTEAD OF DELETE są zdefiniowane w target_table, operacje aktualizacji lub usuwania nie są Zamiast tego wyzwalacze są uruchamiane, a wstawione i usunięte tabele są odpowiednio zapełniane.
Jeśli jakiekolwiek wyzwalacze INSTEAD OF INSERT są zdefiniowane w target_table, operacja wstawiania nie jest wykonywana. Zamiast tego tabela zostanie odpowiednio zapełniona.
Uprawnienia
Wymaga uprawnienia SELECT do tabeli źródłowej oraz uprawnień INSERT, UPDATE lub DELETE do tabeli docelowej. Aby uzyskać więcej informacji, zobacz sekcję Uprawnienia w artykułach SELECT, INSERT, UPDATE i DELETE.
Optymalizacja wydajności instrukcji MERGE
Używając instrukcji MERGE, można zamienić poszczególne DML instrukcje za pomocą jednej instrukcji. Może to poprawić wydajność zapytań, ponieważ operacje są wykonywane w ramach jednej instrukcji, co minimalizuje liczbę przetwarzania danych w tabelach źródłowej i docelowej. Jednak wzrost wydajności zależy od posiadania prawidłowych indeksów, złączeń i innych czynników.
Sprawdzone metody dotyczące indeksowania
Aby poprawić wydajność instrukcji MERGE, zalecamy następujące wytyczne dotyczące indeksów :
- Utwórz indeks na kolumnach łączenia w tabeli źródłowej, który jest unikalny i obejmujący.
- Utwórz unikalny indeks klastrowy na kolumnach łączenia w tabeli docelowej.
Te indeksy zapewniają, że klucze łączenia są unikalne, a dane w tabelach są sortowane. Wydajność zapytań jest lepsza, ponieważ optymalizator zapytań nie musi wykonywać dodatkowego przetwarzania walidacji w celu zlokalizowania i zaktualizowania zduplikowanych wierszy, a dodatkowe operacje sortowania nie są konieczne.
DOŁĄCZ do najlepszych praktyk
Aby ulepszyć wykonanie instrukcji MERGE i upewnienie się, że wyniki są prawidłowe, zalecamy przestrzeganie następujących wytycznych dotyczących łączenia:
- Określ tylko warunki wyszukiwania w warunku ON < merge_search_condition >, która określa kryteria dopasowania danych w tabelach źródłowej i docelowej. Oznacza to, że określ tylko kolumny z tabeli docelowej, które są porównywane z odpowiednimi kolumnami tabeli źródłowej.
- Nie uwzględniaj porównań z innymi wartościami, takimi jak stała.
Aby odfiltrować wiersze z tabel źródłowych lub docelowych, użyj jednej z następujących metod.
- Określ warunek wyszukiwania dla filtrowania wierszy w odpowiedniej klauzuli WHEN. Na przykład, JEŻELI NIE DOPASOWANE I S.EmployeeName LIKE „S%” THEN INSERT ….
- Zdefiniuj widok źródła lub celu, który zwraca filtrowane wiersze i odwołuje się do widoku jako źródła lub celu stół. Jeśli widok jest zdefiniowany w tabeli docelowej, wszelkie działania przeciwko niemu muszą spełniać warunki aktualizacji widoków. Aby uzyskać więcej informacji na temat aktualizowania danych przy użyciu widoku, zobacz Modyfikowanie danych za pomocą widoku.
- Użyj klauzuli
WITH <common table expression>
, aby odfiltrować wiersze z tabel źródłowych lub docelowych . Ta metoda jest podobna do określania dodatkowych kryteriów wyszukiwania w klauzuli ON i może dawać niepoprawne wyniki. Zalecamy unikanie korzystania z tej metody lub dokładne testowanie przed jej wdrożeniem.
Operacja łączenia w instrukcji MERGE jest optymalizowana w taki sam sposób, jak łączenie w instrukcji SELECT. Oznacza to, że gdy dołączają procesy SQL Server, optymalizator zapytań wybiera najbardziej wydajną metodę (spośród kilku możliwości) przetwarzania sprzężenia. Gdy źródło i cel mają podobny rozmiar, a wytyczne dotyczące indeksu opisane wcześniej są stosowane do tabel źródłowych i docelowych, operator łączenia scalającego jest najbardziej wydajnym planem zapytania. Dzieje się tak, ponieważ obie tabele są skanowane raz i nie ma potrzeby sortowania danych. Gdy źródło jest mniejsze niż tabela docelowa, preferowany jest zagnieżdżony operator pętli.
Możesz wymusić użycie określonego sprzężenia, określając klauzulę OPTION (<query_hint>)
w oświadczenie MERGE. Zalecamy, aby nie używać łączenia hash jako wskazówki dotyczącej zapytania dla instrukcji MERGE, ponieważ ten typ łączenia nie używa indeksów.
Najlepsze praktyki dotyczące parametryzacji
Jeśli a SELECT, INSERT, UPDATE lub instrukcja DELETE jest wykonywana bez parametrów, optymalizator zapytań SQL Server może wewnętrznie sparametryzować instrukcję. Oznacza to, że wszelkie wartości literałów zawarte w zapytaniu są zastępowane parametrami. Na przykład instrukcja INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10), może być zaimplementowana wewnętrznie jako INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2). Ten proces, zwany prostą parametryzacją, zwiększa zdolność silnika relacyjnego do dopasowywania nowych instrukcji SQL do istniejących, wcześniej skompilowanych planów wykonania. Wydajność zapytań może ulec poprawie, ponieważ zmniejsza się częstotliwość kompilacji zapytań i ponownych kompilacji. Optymalizator zapytań nie stosuje prostego procesu parametryzacji do instrukcji MERGE. Dlatego instrukcje MERGE, które zawierają wartości literałów, mogą nie działać tak dobrze, jak poszczególne instrukcje INSERT, UPDATE lub DELETE, ponieważ nowy plan jest kompilowany za każdym razem, gdy wykonywana jest instrukcja MERGE.
Aby poprawić wydajność zapytań, zalecamy następujące wytyczne dotyczące parametryzacji:
- Sparametryzuj wszystkie wartości literałów w klauzuli
ON <merge_search_condition>
oraz wWHEN
klauzule oświadczenia MERGE. Na przykład możesz włączyć instrukcję MERGE do procedury składowanej, zastępując wartości literałów odpowiednimi parametrami wejściowymi. - Jeśli nie możesz sparametryzować instrukcji, utwórz przewodnik po planie typu
TEMPLATE
i podaj wskazówkę dotyczącą zapytaniaPARAMETERIZATION FORCED
w przewodniku po planie. - Jeśli instrukcje MERGE są często wykonywane w bazie danych, rozważ ustawienie opcji PARAMETERYZACJA w baza danych na FORCED. Zachowaj ostrożność podczas ustawiania tej opcji. Opcja
PARAMETERIZATION
jest ustawieniem na poziomie bazy danych i wpływa na sposób przetwarzania wszystkich zapytań do bazy danych.
TOP Clause Best Practices
W instrukcji MERGE klauzula TOP określa liczbę lub procent wierszy, na które ma wpływ po połączeniu tabeli źródłowej i tabeli docelowej, a po usunięciu wierszy, które nie kwalifikują się do operacji wstawiania, aktualizowania lub usuwania . Klauzula TOP dodatkowo zmniejsza liczbę połączonych wierszy do określonej wartości, a czynności wstawiania, aktualizowania lub usuwania są stosowane do pozostałych połączonych wierszy w nieuporządkowany sposób. Oznacza to, że nie ma kolejności, w jakiej wiersze są rozdzielane między akcje zdefiniowane w klauzulach WHEN. Na przykład określenie TOP (10) wpływa na 10 wierszy; z tych wierszy, 7 można zaktualizować, a 3 wstawić, lub 1 można usunąć, 5 zaktualizować, 4 wstawić i tak dalej.
Często używa się klauzuli TOP do wykonywania języka manipulacji danymi (DML ) operacje na dużym stole w partiach. Używając w tym celu klauzuli TOP w instrukcji MERGE, ważne jest, aby zrozumieć następujące implikacje.
-
Może to wpłynąć na wydajność I / O.
Instrukcja MERGE wykonuje pełne skanowanie zarówno tabeli źródłowej, jak i docelowej. Dzielenie operacji na partie zmniejsza liczbę operacji zapisu wykonywanych na partię; jednak każda partia wykonuje pełne skanowanie tabeli źródłowej i docelowej. Wynikowe działanie odczytu może wpłynąć na wydajność zapytania.
-
Mogą wystąpić nieprawidłowe wyniki.
Ważne jest, aby upewnić się, że wszystkie kolejne partie są kierowane na nowe wiersze lub może wystąpić niepożądane zachowanie, takie jak nieprawidłowe wstawianie zduplikowanych wierszy do tabeli docelowej. Może się tak zdarzyć, gdy tabela źródłowa zawiera wiersz, który nie był w partii docelowej, ale znajdował się w ogólnej tabeli docelowej.
-
Aby zapewnić prawidłowe wyniki:
- Użyj klauzuli ON, aby określić, które wiersze źródłowe wpływają na istniejące wiersze docelowe, a które są naprawdę nowe.
- Użyj dodatkowego warunku w klauzuli WHEN MATCHED, aby określić, czy wiersz docelowy został już zaktualizowany przez poprzednia partia.
Ponieważ klauzula TOP jest stosowana dopiero po zastosowaniu tych klauzul, każde wykonanie albo wstawia jeden naprawdę niedopasowany wiersz, albo aktualizuje jeden istniejący wiersz.
Bulk Load Best Practices
Instrukcja MERGE może służyć do wydajnego masowego ładowania danych z pliku źródłowego do tabeli docelowej, określając klauzulę OPENROWSET(BULK…)
jako źródło tabeli. W ten sposób cały plik jest przetwarzany w jednej partii.
Aby poprawić wydajność procesu scalania zbiorczego, zalecamy następujące wytyczne:
-
Utwórz indeks klastrowy na kolumnach łączenia w tabeli docelowej.
-
Użyj wskazówek ORDER i UNIQUE w klauzuli
OPENROWSET(BULK…)
, aby określić sposób sortowania źródłowego pliku danych.Domyślnie operacja zbiorcza zakłada, że plik danych jest nieuporządkowany. Dlatego ważne jest, aby dane źródłowe były posortowane zgodnie z indeksem klastrowym w tabeli docelowej i aby wskazać kolejność za pomocą wskazówki ORDER, tak aby optymalizator zapytań mógł wygenerować bardziej wydajny plan zapytań. Wskazówki są sprawdzane w czasie wykonywania; jeśli strumień danych nie jest zgodny z określonymi wskazówkami, generowany jest błąd.
Te wytyczne zapewniają, że klucze łączenia są unikalne, a kolejność sortowania danych w plik źródłowy pasuje do tabeli docelowej. Wydajność zapytań jest lepsza, ponieważ dodatkowe operacje sortowania nie są konieczne i niepotrzebne kopie danych nie są wymagane.
Mierzenie i diagnozowanie wydajności MERGE
Dostępne są następujące funkcje, które pomagają w mierzeniu i diagnozowaniu wydajność instrukcji MERGE.
- Użyj licznika merge stmt w dynamicznym widoku zarządzania sys.dm_exec_query_optimizer_info, aby zwrócić liczbę optymalizacji zapytań dla instrukcji MERGE.
- Użyj atrybut merge_action_type w dynamicznym widoku zarządzania sys.dm_exec_plan_attributes w celu zwrócenia typu planu wykonania wyzwalacza używanego jako wynik instrukcji MERGE.
- Użyj śledzenia SQL, aby zebrać dane dotyczące rozwiązywania problemów dla instrukcji MERGE w ten sam sposób zrobiłbyś to dla innych instrukcji języka manipulacji danymi (DML). Aby uzyskać więcej informacji, zobacz Śledzenie SQL.
Przykłady
A. Używanie funkcji MERGE do wykonywania operacji INSERT i UPDATE na tabeli w pojedynczej instrukcji
Typowym scenariuszem jest aktualizacja jednej lub więcej kolumn w tabeli, jeśli istnieje pasujący wiersz. Lub wstawienie danych jako nowego wiersza, jeśli pasujący wiersz nie istnieje. Zwykle każdy scenariusz jest wykonywany przez przekazanie parametrów do procedury składowanej, która zawiera odpowiednie instrukcje UPDATE i INSERT. Za pomocą instrukcji MERGE można wykonać oba zadania w pojedyncza instrukcja. Poniższy przykład przedstawia procedurę składowaną w bazie danych AdventureWorks2012, która zawiera zarówno instrukcję INSERT, jak i instrukcję UPDATE. Procedura jest następnie modyfikowana w celu uruchomienia równoważnych operacji przy użyciu pojedynczej instrukcji MERGE.
B . Używanie funkcji MERGE do wykonywania operacji UPDATE i DELETE na tabeli w pojedynczej instrukcji
W poniższym przykładzie użyto funkcji MERGE do zaktualizowania tabeli ProductInventory
w przykładowej bazie danych AdventureWorks2012. codziennie na podstawie zamówień przetwarzanych w tabeli SalesOrderDetail
. Kolumna Quantity
w kolumnie ProductInventory
jest aktualizowana poprzez odjęcie liczby zamówień składanych każdego dnia na każdy produkt w SalesOrderDetail
tabela. Jeśli liczba zamówień na produkt obniży poziom zapasów produktu do 0 lub mniej, wiersz dla tego produktu zostanie usunięty z tabeli ProductInventory
.
C. Używanie funkcji MERGE do wykonywania operacji UPDATE i INSERT na tabeli docelowej przy użyciu pochodnej tabeli źródłowej
W poniższym przykładzie użyto funkcji MERGE w celu zmodyfikowania tabeli SalesReason
w bazie danych AdventureWorks2012 aktualizując lub wstawiając wiersze. Gdy wartość NewName
w tabeli źródłowej odpowiada wartości w kolumnie Name
tabeli docelowej, (SalesReason
), kolumna ReasonType
zostanie zaktualizowana w tabeli docelowej. Jeśli wartość NewName
nie jest zgodna, wiersz źródłowy jest wstawiany do tabeli docelowej. Tabela źródłowa jest tabelą pochodną, która używa konstruktora wartości tabeli Transact-SQL do określenia wielu wiersze tabeli źródłowej. Aby uzyskać więcej informacji na temat używania konstruktora wartości tabeli w tabeli pochodnej, zobacz Konstruktor wartości tabeli (język Transact-SQL). Przykład pokazuje również, jak przechowywać wyniki klauzuli OUTPUT w zmiennej tabeli. następnie podsumowujesz wyniki instrukcji MERGE, uruchamiając prostą operację wyboru, która zwraca liczbę wstawionych i zaktualizowanych wierszy.
D.Wstawianie wyników instrukcji MERGE do innej tabeli
Poniższy przykład przechwytuje dane zwrócone z klauzuli OUTPUT instrukcji MERGE i wstawia te dane do innej tabeli. Instrukcja MERGE aktualizuje kolumnę Quantity
tabeli ProductInventory
w bazie danych AdventureWorks2012 na podstawie zamówień przetwarzanych w . Przykład przechwytuje zaktualizowane wiersze i wstawia je do innej tabeli używanej do śledzenia zmian w stanie inwentarza.
E. Użycie funkcji MERGE do wykonania WSTAW lub AKTUALIZUJ docelowa tabela krawędzi w bazie danych wykresów
W tym przykładzie utworzysz tabele węzłów Person
i City
oraz tabela krawędzi livesIn
. Używasz instrukcji MERGE na livesIn
krawędzi i wstawiasz nowy wiersz, jeśli krawędź już nie istnieje między Person
i City
. Jeśli krawędź już istnieje, po prostu zaktualizuj atrybut StreetAddress na livesIn
krawędzi.