Optimizing MERGE Statement Performance
W SQL Server 2008, można wykonywać operacje języka (DML) w wielu manipulacji danych w pojedynczej instrukcja przy użyciu instrukcja korespondencji SERYJNEJ. Na przykład konieczne może być synchronizowania dwóch tabel wstawiania, aktualizowania lub usuwania wierszy w jednej tabela, oparte na różnice w drugiej tabela.Zwykle można to zrobić, uruchamiając procedura przechowywana lub partia, który zawiera indywidualne instrukcji INSERT, UPDATE i DELETE.Niemniej jednak, oznacza to, że dane w obu urządzenie źródłowe i tabel docelowych są oceniane i przetwarzane wiele razy, co najmniej jeden raz dla każdego sprawozdania.
Za pomocą instrukcja korespondencji SERYJNEJ, można zastąpić pojedyncze instrukcje DML z pojedynczą instrukcją.Może to zwiększyć wydajność kwerendy, ponieważ operacje są wykonywane wewnątrz pojedynczej instrukcja, w związku z tym, minimalizując liczbę razy dane w urządzenie źródłowe i tabel docelowych są przetwarzane.Jednak wzrost wydajności zależą od mające poprawne indeksów, sprzężenia i inne zagadnienia związane z w miejscu.W tym temacie przedstawiono najlepszymi sposobami, aby osiągnąć optymalną wydajność podczas korzystania z KORESPONDENCJI SERYJNEJ instrukcja.
Najważniejsze wskazówki dotyczące indeksu
Aby zwiększyć wydajność i korespondencji SERYJNEJ, zaleca się następującymi wytycznymi indeksu:
Utworzyć indeks w kolumnach łączyć urządzenie źródłowe tabela, która jest unikatowa i pokrycie.
Tworzenie unikatowego indeks klastrowany w kolumnach łączyć w tabela miejsce docelowe.
Indeksy te upewnij się, że klucze łączyć są unikatowe i dane w tabelach są sortowane.Zwiększona wydajność kwerendy, ponieważ optymalizator kwerendy nie jest konieczne wykonywanie dodatkowego sprawdzania poprawności przetwarzania, aby zlokalizować i zaktualizować zduplikowane wiersze i operacji sortowania dodatkowe nie są konieczne.
Na przykład w następującej instrukcja korespondencji SERYJNEJ urządzenie źródłowe tabela dbo.Purchases, a w tabela miejsce docelowe dbo.FactBuyingHabits, są połączone w kolumnach ProductID i CustomerID. Aby zwiększyć wydajność tej instrukcja, należy utworzyć podstawowy lub unikatowe indeks klucz (klastrowany lub nieklastrowany) na ProductID i CustomerID kolumny na dbo.Purchases Tabela i indeksem klastrowanym dla ProductID i CustomerID kolumny na dbo.FactBuyingHabits Tabela. Aby wyświetlić kod używany do tworzenia tych tabel, zobacz Wstawianie, aktualizowanie i usuwanie danych przy użyciu korespondencji SERYJNEJ.
Najważniejsze wskazówki dotyczące łączyć
Aby zwiększyć wydajność instrukcja korespondencji SERYJNEJ i upewnić się, poprawne wyniki są uzyskiwane, zalecamy następujące wytyczne łączyć:
- Określ tylko warunki wyszukiwania w ON <merge_search_condition> Klauzula, które określają kryteria dopasowywania danych urządzenie źródłowe i tabel. Oznacza to, określ tylko te kolumny z tabela miejsce docelowe, które są porównywane z odpowiednimi kolumnami urządzenie źródłowe tabela.Nie należy umieszczać porównań inne wartości, takie jak stała.
Aby odfiltrować wiersze z urządzenie źródłowe lub docelowe tabele, należy użyć jednej z następujących metod.
Określ warunek wyszukiwania do filtrowania w klauzula gdy odpowiedni wiersz.Na przykład WHEN NOT MATCHED AND S.EmployeeName LIKE 'S%' THEN INSERT....
Definiowanie widoku na urządzenie źródłowe lub cel, zwraca filtrowane wiersze i odwołać widoku jako urządzenie źródłowe lub tabela miejsce docelowe.Jeśli widok jest zdefiniowany w tabela miejsce docelowe, wszystkie akcje przed nim muszą spełniać warunki w celu zaktualizowania widoków.Aby uzyskać więcej informacji na temat aktualizacji danych przy użyciu widoku zobacz Modifying Data Through a View.
Za pomocą WITH <Typowe wyrażenie tabela> Klauzula, aby odfiltrować wiersze w tabelach źródłowych lub miejsce docelowe. Ta metoda jest podobna do określania dodatkowe kryteria wyszukiwania w klauzula ON i może powodować nieprawidłowe wyniki.Zaleca się, że należy unikać stosowania tej metoda lub dokładnie przetestować przed wdrożeniem go.
Aby uzyskać więcej informacji, zobacz Wstawianie, aktualizowanie i usuwanie danych przy użyciu korespondencji SERYJNEJ.
Optymalizacja kwerendy z sprzężenia
Operacja dołączania w instrukcja korespondencji SERYJNEJ jest zoptymalizowana w taki sam sposób jak łączyć w instrukcja SELECT.Oznacza to, kiedy SQL Server przetwarza sprzężeń, optymalizator kwerendy wybiera najbardziej efektywne metoda (z kilku możliwości) przetwarzania łączyć. Aby uzyskać więcej informacji na temat sprzężeń zobacz Join Fundamentals i Advanced Query Tuning Concepts. Gdy urządzenie źródłowe i miejsce docelowe są o podobnych rozmiarach i wskazówek indeksu, opisane wcześniej w sekcji 'Best Practices indeksu' są stosowane do urządzenie źródłowe i tabel docelowych, łączyć korespondencji seryjnej operator jest najbardziej efektywne planu kwerend.Dzieje się tak, ponieważ obie tabele zostaną zeskanowane raz i nie ma potrzeby sortowania danych.Gdy urządzenie źródłowe jest mniejsza niż w tabela miejsce docelowe, zagnieżdżone pętli operator jest zalecane.
Można wymusić użycie określonego łączyć określając OPTION (<query_hint>) Klauzula w instrukcja korespondencji SERYJNEJ. Zaleca się, że nie są używane w sprzężeniu mieszania jako wskazówka dotycząca kwerendy dla korespondencji SERYJNEJ instrukcji ponieważ tego typu łączyć nie używa indeksów.Aby uzyskać więcej informacji na temat wskazówek dotyczących kwerendy Zobacz Query Hints (Transact-SQL). W następującym przykładzie określono łączyć nested loop w klauzula OPTION.
Parametry najważniejszych wskazówek
Jeśli nie określono parametrów, wykonywane jest instrukcja SELECT, INSERT, UPDATE lub DELETE SQL Server optymalizator kwerendy może zdecydować, czy parameterize wewnętrznie w instrukcji. Oznacza to, że wartości literału, które są zawarte w kwerendzie są zastępowane z parametrami.Na przykład instrukcja INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10), mogą być realizowane wewnętrznie jako INSERT dbo.MyTable (Col1, Col2) VALUES (@p1, @p2). Ten proces nazywany parametryzacja proste, zwiększa możliwość odpowiada nowej instrukcji SQL, wcześniej skompilowany plany wykonanie aparat relacyjny.Wydajność kwerendy może zostać podniesiona, ponieważ są redukowane częstotliwość kompilacji kwerendy i ponowne kompilacje.optymalizator kwerendy nie dotyczy proces parametryzacji proste instrukcje korespondencji SERYJNEJ.W związku z tym instrukcje korespondencji SERYJNEJ, które zawierają wartości literałów nie może wykonać, a także dla pojedynczych INSERT, UPDATE, lub DELETE instrukcja, ponieważ nowy plan jest tworzone przy każdym wykonaniu instrukcja korespondencji SERYJNEJ.
Aby poprawić wydajność kwerendy, zaleca się następującymi wytycznymi parametryzacji:
Wszystkie wartości literału parameterize ON <merge_search_condition> Klauzula i w polu klauzule po instrukcja korespondencji SERYJNEJ. Na przykład można dołączyć instrukcja korespondencji SERYJNEJ do procedura przechowywana, zastępowanie wartości literałów odpowiednich parametrów wejściowych.
Jeśli nie parameterize instrukcja, utworzenia plan wykonania kwerendy typu TEMPLATE i określ wskazówkę dotyczącą ZMUSZONY PARAMETRYZACJI kwerendy w plan wykonania kwerendy.Aby uzyskać więcej informacji zobaczSpecifying Query Parameterization Behavior by Using Plan Guides.
Instrukcje korespondencji SERYJNEJ są często wykonywane w bazie danych, należy rozważyć ustawienie opcji Parametry bazy danych na FORCED.Ustawienie tej opcji, należy zachować ostrożność.Opcja PARAMETRYZACJI jest ustawienie poziom bazy danych i ma wpływ na sposób wszystkie kwerendy w bazie danych są przetwarzane.Aby uzyskać więcej informacji zobaczParametryzacja wymuszony.
Najważniejsze wskazówki klauzula TOP
W instrukcja korespondencji SERYJNEJ klauzula TOP Określa numer lub procent wierszy, które mogą mieć wpływ po urządzenie źródłowe połączonych tabel i tabela miejsce docelowe, a po wierszy, nie kwalifikują się do wstawiania, aktualizacji lub usuwania akcja są usuwane.Dalsze klauzula TOP zmniejsza liczbę wierszy sprzężonych określona wartość i wstawiania, aktualizacji lub usuwania akcji są stosowane do pozostałych połączonych wierszy w sposób nieuporządkowana.Oznacza to nie istnieje żadne zlecenia, w którym umieszczone są wiersze akcji, zdefiniowanych w klauzulach podczas.Na przykład określając TOP (10) wpływa na wiersze 10; tych wierszy, 7 może zostać zaktualizowany i dodaje 3 lub 1 może być usunięty, zaktualizowane 5, a 4 wstawione i tak dalej.
Są często, aby użyć klauzula TOP do wykonywania operacji na język (DML) manipulacji na danych w dużej tabela w plikach wsadowych.W przypadku korzystania z klauzula TOP w instrukcja korespondencji SERYJNEJ w tym celu, ważne jest zrozumienie następujących.
Może mieć wpływ wydajność wejścia/wyjścia.
Instrukcja korespondencji SERYJNEJ wykonuje skanowanie pełne tabela obu urządzenie źródłowe i tabel.Podział operacji do partia zmniejsza liczbę operacji zapisu przeprowadzonych nie tylko na partię; jednak każdej partia wykona skanowanie pełne tabela urządzenie źródłowe i tabel.Wynikowy odczytu działanie może mieć wpływ na wydajność kwerendy.
Może wystąpić, nieprawidłowe wyniki.
Ważne jest upewnić się, że wszystkie kolejne instancje kierować nowych wierszy lub niepożądane zachowanie, takich jak nieprawidłowe wstawiania zduplikowane wiersze w tabela tartget może pojawić się wtedy.Może się to zdarzyć, gdy tabela źródłowa zawiera wiersz, który nie był we wsadzie miejsce docelowe, ale w ogólnej tabeli miejsce docelowe.
Aby mieć pewność, że poprawne wyniki:
Za pomocą klauzula ON określić wiersze urządzenie źródłowe, które wpływają na istniejących wierszy miejsce docelowe, które są rzeczywiście nowe.
Użyj dodatkowy warunek w po klauzula MATCHED, aby określić, jeśli wiersz miejsce docelowe został już zaktualizowany przez poprzednie zadanie partia.
Ponieważ po zastosowaniu tych klauzul jest tylko stosowana jest klauzula TOP, wykonywanie każdego wstawia wiersz rzeczywiście niedopasowanych lub aktualizuje istniejące wiersz.Poniższy przykład tworzy urządzenie źródłowe i tabeli docelowej, a następnie przedstawia poprawnego metoda przy użyciu klauzula TOP, aby zmodyfikować obiekt miejsce docelowe operacji wsadowych.
W poniższym przykładzie zademonstrowano niepoprawnej metoda stosowania klauzula TOP.Sprawdzenie is_current Kolumna jest określona w warunek łączyć z urządzenie źródłowe tabela. Oznacza to, że wiersz urządzenie źródłowe używane w jednej partia będą traktowane jako "nie odpowiada" w następnej partia, powodując zbędny wstawić operacji.
W poniższym przykładzie pokazano również niepoprawnej metoda.Przy użyciu typowych wyrażenie tabela (CTE) aby ograniczyć liczbę wierszy, przeczytaj dla partia, każdy wiersz urządzenie źródłowe, które będzie mieć dopasowane wiersza docelowego, innych niż jednym wybranym przez TOP(1) jest traktowane jako "nie odpowiada", co w przypadku operacji wstawiania niepożądane.Ponadto ta metoda jedynie ogranicza liczbę wierszy, które mogą być aktualizowane, każdej partia próby wstawienia obiektu wszystkie wiersze urządzenie źródłowe "niedopasowanych".
Najważniejsze wskazówki dotyczące ładowanie zbiorcze
Instrukcja korespondencji SERYJNEJ może służyć do efektywnego masowych ładowania danych z pliku urządzenie źródłowe danych przez określenie klauzula OPENROWSET(BULK…) jako urządzenie źródłowe tabela tabela miejsce docelowe.Postępując w ten sposób, cały plik jest przetwarzany w jednej partia.
Aby zwiększyć wydajność procesu scalania zbiorczej, zaleca się następującymi wskazówkami:
Tworzenie indeks klastrowany w kolumnach łączyć w tabela miejsce docelowe.
Aby określić sposób sortowania jest plik urządzenie źródłowe danych, należy użyć wskazówki ORDER i unikatowy w klauzula OPENROWSET(BULK…).
Domyślnie operacja zbiorcza zakłada się, plik danych jest nieuporządkowana.Dlatego jest ważne, że urządzenie źródłowe danych jest posortowany zgodnie z indeksem klastrowanym dla tabela miejsce docelowe i że wskazówka ORDER jest używany do wskazania kolejności tak, że optymalizator kwerendy może wygenerować bardziej efektywny plan kwerend.Wskazówki dotyczące sprawdzania poprawności w czasie wykonywania, jeśli strumienia danych nie jest zgodna z określonym wskazówek, błąd zostanie zaokrąglona.
Te wytyczne upewnić się, że łączyć klucze są unikatowe i kolejność sortowania danych w pliku źródłowym pasuje do tabela miejsce docelowe.Zwiększona wydajność kwerendy, ponieważ operacje sortowania dodatkowe nie są konieczne, a kopie niepotrzebne dane nie są wymagane.W poniższym przykładzie użyto instrukcja korespondencji SERYJNEJ do ładowanie zbiorcze danych z StockData.txt, plik prosty, w tabela miejsce docelowe dbo.Stock. Definiując ograniczenia na klucz podstawowy w StockName w tabela miejsce docelowe indeks klastrowany jest tworzony na podstawie kolumna, używane do dołączenia z urządzenie źródłowe danych. Wskazówki ORDER i unikatowy są stosowane do Stock kolumna w danych urządzenie źródłowe, który jest mapowany do kolumna klucz indeks klastrowany w tabela miejsce docelowe.
Przed uruchomieniem w tym przykładzie należy utworzyć plik tekstowy o nazwie StockData.txt w folderze C:\SQLFiles\.Plik powinien mieć dwie kolumny danych, oddzielając je przecinkami.Na przykład należy użyć następujących danych.
Rowerów górskich Alpine, 100
Zestaw hamulców, 22
Poduszka 5
Następnie należy utworzyć plik formatu xml o nazwie BulkloadFormatFile.xml w folderze C:\SQLFiles\.Użyj poniższych informacji.
<? xml w wersja "1.0" =?>
<Xmlns:xsi="http://www.w3.org/2001/XMLSchema-wystąpienie xmlns="https://schemas.microsoft.com/sqlserver/2004/bulkload/format BCPFORMAT"">
<REKORD>
<pole ID = "1" xsi: type = "CharTerm" TERMINATOR = "," MAX_LENGTH = "25" />
<pole ID = "2" xsi: type = "CharTerm" TERMINATOR = "\r\n" MAX_LENGTH = "5" />
</ REKORD>
<WIERSZ>
<Kolumna urządzenie źródłowe = "1" NAME = "Nośników" xsi: type = "SQLNVARCHAR" />
<Kolumna źródłową = "2" NAME = "Zmiana" xsi: type = "SQLSMALLINT" />
</ WIERSZA>
</ BCPFORMAT>
Miary i diagnozowania wyników korespondencji SERYJNEJ
Następujące funkcje są dostępne pomóc w wymiarach i diagnozowania wykonywania instrukcji korespondencji SERYJNEJ.
Użycie stmt korespondencji seryjnej Licznik sys.dm_exec_query_optimizer_info dynamicznego zarządzania numer optymalizacji kwerendy dla instrukcji korespondencji SERYJNEJ.
Użycie merge_action_type atrybutsys.dm_exec_plan_attributes dynamicznego zarządzania funkcja zwraca typ planu wykonania wyzwalacza używane w wyniku instrukcja korespondencji SERYJNEJ.
Za pomocą śledzenia SQL do zbierania danych dotyczących rozwiązywania problemów dla instrukcja korespondencji SERYJNEJ w taki sam sposób, jak dla innych instrukcja języka (DML) manipulacji na danych.Aby uzyskać więcej informacji zobaczIntroducing SQL Trace.
See Also