Zarządzanie rozmiarami masowych partii kopii

Dotyczy:sql ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Głównym celem partii w operacjach kopiowania masowego jest określenie zakresu transakcji. Jeśli rozmiar partii nie jest ustawiony, funkcje kopiowania masowego traktują całą kopię zbiorczą jako jedną transakcję. Jeśli zostanie ustalona wielkość partii, każda partia stanowi transakcję, która zostaje zatwierdzona po zakończeniu partii.

Jeśli kopia masowa zostanie wykonana bez określonej wielkości partii i pojawi się błąd, cała kopia masowa jest cofana z powrotem. Odzyskanie długoletniej kopii masowej może zająć dużo czasu. Gdy ustalony jest rozmiar partii, kopia masowa traktuje każdą partię jako transakcję i zatwierdza każdą partię. Jeśli pojawi się błąd, należy cofnąć tylko ostatnią nieopłaconą partię.

Wielkość partii może również wpływać na blokowanie nad głową. Podczas kopiowania masowego na SQL Server, wskazówka TABLOCK może być określona za pomocą bcp_control, aby uzyskać blokadę tabeli zamiast blokad wierszowych. Blokadę pojedynczego stołu można utrzymać przy minimalnym narzutu dla całej operacji kopiowania masowego. Jeśli TABLOCK nie jest określony, blokady są utrzymywane na poszczególnych wierszach, a narzut związany z utrzymaniem wszystkich blokad przez cały czas kopii zbiorczej może spowolnić wydajność. Ponieważ blokady są utrzymywane tylko przez czas trwania transakcji, określenie rozmiaru partii rozwiązuje ten problem poprzez okresowe generowanie commitu, który uwalnia aktualnie posiadane blokady.

Liczba wierszy tworzących partię może mieć istotny wpływ na wydajność przy kopiowaniu dużej liczby wierszy. Zalecenia dotyczące wielkości partii zależą od rodzaju kopii masowej.

  • Podczas kopiowania masowego do SQL Server określ wskazówkę do masowego kopiowania TABLOCK i ustaw dużą wielkość partii.

  • Gdy TABLOCK nie jest określony, ogranicz rozmiar partii do mniej niż 1000 wierszy.

Podczas kopiowania masowego z pliku danych rozmiar wsadu określa się, wywołując bcp_control z opcją BCPBATCH przed wywołaniem bcp_exec. Podczas kopiowania masowego ze zmiennych programowych za pomocą bcp_bind i bcp_sendrow, rozmiar partii jest kontrolowany przez wywołanie bcp_batch po wywołaniu bcp_sendrowx razy, gdzie x to liczba wierszy w partii.

Oprócz określania rozmiaru transakcji, partie wpływają także na to, kiedy wiersze są wysyłane przez sieć do serwera. Funkcje kopiowania masowego zwykle zapisują wiersze z bcp_sendrow do momentu wypełnienia pakietu sieciowego, a następnie wysyłają pełny pakiet na serwer. Jednak gdy aplikacja wywołuje bcp_batch, bieżący pakiet jest wysyłany do serwera, niezależnie od tego, czy został już wypełniony. Używanie bardzo małej wielkości partii może spowolnić wydajność, jeśli skutkuje wysłaniem wielu częściowo wypełnionych pakietów do serwera. Na przykład wywołanie bcp_batch po każdym bcp_sendrow powoduje, że każdy wiersz jest wysyłany w osobnym pakiecie, a jeśli wiersze nie są bardzo duże, marnuje miejsce w każdym pakiecie. Domyślny rozmiar pakietów sieciowych dla SQL Server wynosi 4 KB, choć aplikacja może zmienić rozmiar, wywołując SQLSetConnectAttr i określając atrybut SQL_ATTR_PACKET_SIZE.

Kolejnym skutkiem ubocznym partii jest to, że każda partia jest uważana za zestaw wyników outstanding aż do ukończenia z bcp_batch. Jeśli na uchwytie połączenia zostaną podjęte inne operacje, gdy partia jest w oczekiwaniu, sterownik ODBC natywnego klienta SQL Server wyświetla błąd z SQLState = "HY000" oraz ciąg komunikatów o błędzie:

"[Microsoft][SQL Server Native Client] Connection is busy with  
results for another hstmt."