Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wstawianie zbiorcze programu SQL Server — część 2

W poprzedniej części tego artykułu omówiliśmy, jak importować pliki CSV do SQL Server za pomocą instrukcji BULK INSERT. Omówiliśmy główną metodologię procesu wstawiania zbiorczego, a także szczegóły opcji BATCHSIZE i MAXERRORS w scenariuszach. W tej części omówimy kilka innych opcji (FIRE_TRIGGERS, CHECK_CONSTRAINTS i TABLOCK) procesu wstawiania zbiorczego w różnych scenariuszach.

Scenariusz 1:czy możemy włączyć wyzwalacze w tabeli docelowej podczas operacji wstawiania zbiorczego?

Domyślnie podczas procesu wstawiania zbiorczego wyzwalacze wstawiania określone w tabeli docelowej nie są uruchamiane, jednak w niektórych sytuacjach możemy chcieć włączyć te wyzwalacze. Rozwiązaniem tego problemu jest użycie opcji FIRE_TRIGGERS w zbiorczych instrukcjach wstawiania. Chcę dodać informację, że ta opcja może wpływać i zmniejszać wydajność operacji wstawiania zbiorczego, ponieważ wyzwalacz/wyzwalacze mogą wykonywać oddzielne operacje w bazie danych. W poniższym przykładzie zademonstrujemy to. Na początku nie ustawimy parametru FIRE_TRIGGERS, a proces zbiorczego wstawiania nie uruchomi wyzwalacza wstawiania. W poniższym skrypcie T-SQL zdefiniujemy wyzwalacz wstawiania dla tabeli Sales.

DROP TABLE IF EXISTS Sprzedaż CREATE TABLE [dbo].[Sprzedaż]( [Region] [varchar](50) , [Kraj] [varchar](50) , [ItemType] [varchar](50) NULL, [ SalesChannel] [varchar] (50) NULL, [OrderPriority] [varchar] (50) NULL, [OrderDate] datetime, [OrderID] bigint NULL, [ShipDate] datetime, [UnitsSold] float, [CenaJednostkowa] float, [KosztJednostkowy] float, [TotalRevenue] float, [TotalCost] float, [TotalProfit] float) DROP TABLE IF EXISTS SalesLogCREATE TABLE SalesLog (OrderIDLog bigint)GOCREATE TRIGGER OrderLogIns ON SalesFOR INSERTASBEGIN SET NOCOUNT ON INSERT INTO SalesLogSELECT\ROM0000C Sales Records.csv'WITH (FIRSTROW =2, FIELDTERMINATOR =',', ROWTERMINATOR='\n' ); SELECT Count(*) FROM SalesLog

Jak widać powyżej, wyzwalacz wstawiania nie zadziałał, ponieważ nie ustawiliśmy opcji FIRE_TRIGGERS. Teraz dodamy opcję FIRE_TRIGGERS do instrukcji zbiorczego wstawiania, aby ta opcja umożliwiała wstawienie wyzwalacza ognia.

 BULK INSERT SalesFROM 'C:\1500000 Sales Records.csv'WITH (FIRSTROW =2, FIELDTERMINATOR =',', ROWTERMINATOR='\n',FIRE_TRIGGERS);GOSELECT Count(*) as [NumberOfRowsinTriggerTable] FROM SalesLog 

Scenariusz 2:Jak włączyć ograniczenie sprawdzające podczas operacji wstawiania zbiorczego?

Ograniczenia sprawdzania pozwalają nam wymusić integralność danych w tabelach SQL Server. Celem ograniczenia jest sprawdzenie wprowadzonych, zaktualizowanych lub usuniętych wartości zgodnie z ich regulacją składni. Na przykład ograniczenie NOT NULL zapewnia, że ​​określona kolumna nie może być modyfikowana przez wartość NULL. Teraz skupimy się na ograniczeniach i interakcji wstawiania zbiorczego. Domyślnie podczas procesu zbiorczego wstawiania wszelkie ograniczenia sprawdzania i klucza obcego są ignorowane, ale ta opcja ma pewne wyjątki. Zgodnie z dokumentacją Microsoft „ograniczenia UNIKATOWEGO i PRIMARY KEY są zawsze wymuszane. Podczas importowania do kolumny znaków, dla której zdefiniowano ograniczenie NOT NULL, funkcja BULK INSERT wstawia pusty ciąg, gdy plik tekstowy nie zawiera żadnej wartości”. W poniższym skrypcie T-SQL dodamy ograniczenie sprawdzające do kolumny OrderDate, która kontroluje datę zamówienia większą niż 01.01.2016.

DROP TABLE IF EXISTS Sprzedaż CREATE TABLE [dbo].[Sprzedaż]( [Region] [varchar](50) , [Kraj] [varchar](50) , [ItemType] [varchar](50) NULL, [ SalesChannel] [varchar] (50) NULL, [OrderPriority] [varchar] (50) NULL, [OrderDate] datetime, [OrderID] bigint NULL, [ShipDate] datetime, [UnitsSold] float, [CenaJednostkowa] float, [KosztJednostkowy] float, [TotalRevenue] float, [TotalCost] float, [TotalProfit] float) ALTER TABLE [Sales] ADD CONSTRAINT OrderDate_CheckCHECK(OrderDate>'20160101')BULK INSERT SalesFROM 'C:\1500000 Sales Records.csv'WITH (FIRSTROW =2 , FIELDTERMINATOR =',', ROWTERMINATOR='\n' );GOSELECT COUNT(*) AS [UnChekedData] FROM Sprzedaż WHERE Data zamówienia <'20160101'

Jak widać w powyższym przykładzie, proces wstawiania zbiorczego pomija kontrolę ograniczenia sprawdzania. Jednak SQL Server wskazuje ograniczenie sprawdzania jako niezaufane.

SELECT is_not_trusted ,* FROM sys.check_constraints gdzie name='OrderDate_Check'

Ta wartość wskazuje, że ktoś wstawił lub zaktualizował dane do tej kolumny przez pominięcie ograniczenia sprawdzania, jednocześnie ta kolumna może zawierać niespójne dane w odniesieniu do tego ograniczenia. Teraz spróbujemy wykonać instrukcję zbiorczego wstawiania z opcją CHECK_CONSTRAINTS. Wynik jest bardzo prosty, ograniczenie sprawdzania zwraca błąd z powodu niewłaściwych danych.

BULK INSERT SalesFROM 'C:\1500000 Sales Records.csv'WITH (FIRSTROW =2, FIELDTERMINATOR =',', ROWTERMINATOR='\n' );

Scenariusz 3:Jak zwiększyć wydajność wielu wstawek zbiorczych do jednej tabeli docelowej?

Głównym celem mechanizmu blokowania w SQL Server jest ochrona i zapewnienie integralności danych. W artykule Główne pojęcie blokowania SQL Server można znaleźć szczegółowe informacje na temat mechanizmu blokowania. Teraz skupimy się na szczegółach blokowania procesu wstawiania zbiorczego. Jeśli uruchomisz instrukcję zbiorczego wstawiania bez opcji TABLELOCK, uzyskuje blokadę wierszy lub tabeli zgodnie z hierarchią blokad. Jednak w niektórych przypadkach możemy chcieć wykonać wiele procesów wstawiania zbiorczego w jednej tabeli docelowej, dzięki czemu możemy skrócić czas operacji wstawiania zbiorczego. Najpierw wykonamy jednocześnie dwie instrukcje zbiorczego wstawiania i przeanalizujemy zachowanie mechanizmu blokującego. Otworzymy dwa okna zapytań w SQL Server Management Studio i uruchomimy jednocześnie następujące instrukcje zbiorczego wstawiania.

BULK INSERT SalesFROM 'C:\1500000 Sales Records.csv'WITH (FIRSTROW =2, FIELDTERMINATOR =',', ROWTERMINATOR='\n' );

Kiedy wykonujemy następujące zapytanie dmv (Dynamic Management View), które pomaga monitorować stan procesu wstawiania zbiorczego.

SELECT session_id,command,status,last_wait_type,text FROM sys.dm_exec_requests stosuje się krzyżowo sys.dm_exec_sql_text(sys.dm_exec_requests.sql_handle)gdzie tekst taki jak '%BULK INSERT Sales%' i identyfikator_sesji 
>@@ 

Jak widać na powyższym obrazku, sesja 61, stan procesu wstawiania zbiorczego jest zawieszony z powodu zablokowania. Jeśli zweryfikujemy problem, sesja 59 blokuje tabelę docelową wstawiania zbiorczego, a sesja 61 czeka na zwolnienie tej blokady, aby kontynuować proces wstawiania zbiorczego. Teraz dodamy opcję TABLOCK do zbiorczych instrukcji wstawiania i wykonamy zapytania.

Gdy ponownie wykonujemy zapytanie monitorujące dmv, nie widzimy żadnego zawieszonego procesu zbiorczego wstawiania, ponieważ SQL Server używa specjalnego typu blokady zwanego blokadą zbiorczej aktualizacji (BU). Ten typ blokady umożliwia jednoczesne przetwarzanie wielu operacji wstawiania zbiorczego względem tej samej tabeli, a ta opcja również zmniejsza całkowity czas procesu wstawiania zbiorczego.

Gdy wykonujemy następujące zapytanie podczas procesu wstawiania zbiorczego, możemy monitorować szczegóły blokowania i typy blokad.

SELECT dm_tran_locks.request_session_id, dm_tran_locks.resource_database_id, DB_NAME(dm_tran_locks.resource_database_id) AS nazwa_bazy, CASE WHEN resource_type ='OBJECT' THEN OBJECT_NAME(dm_tran_associated.ID_zasobów_obiektu.NAZWA_obiektu_nazwa_zasobu_obiektu_nazwa_zasobu indexes.name AS index_name, dm_tran_locks.resource_type, dm_tran_locks.resource_description, dm_tran_locks.resource_associated_entity_id, dm_tran_locks.request_mode, dm_tran_locks.request_statusFROM sys.dm_tran_locksLEFT JOIN sys.partitions ON partitions.hobt_id =dm_tran_locks.resource_associated_entity_idLEFT JOIN sys.indexes ON indexes.OBJECT_ID =partitions .OBJECT_ID AND indexes.index_id =partitions.index_idGDZIE resource_associated_entity_id> 0 AND resource_database_id =DB_ID()

Wniosek

W tym artykule omówiliśmy wszystkie szczegóły operacji wstawiania zbiorczego w programie SQL Server. W szczególności wspomnieliśmy o poleceniu BULK INSERT oraz jego ustawieniach i opcjach, a także przeanalizowaliśmy różne scenariusze, które są zbliżone do rzeczywistych problemów.

 

Referencje

WSTAWIANIE ZBIORCZE (Transact-SQL)

Wymagania wstępne dotyczące minimalnego logowania w imporcie zbiorczym

Kontrolowanie zachowania blokowania przy imporcie zbiorczym

Dalsze czytanie

Eksportowanie danych do płaskiego pliku za pomocą narzędzia BCP i importowanie danych za pomocą wstawiania zbiorczego

Przydatne narzędzie:

dbForge Data Pump – dodatek SSMS do wypełniania baz danych SQL zewnętrznymi danymi źródłowymi i migracji danych między systemami.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdź, czy ciąg zawiera znaki akcentowane w SQL?

  2. Instalacja klastra pracy awaryjnej serwera SQL -1

  3. Czy posiadanie „LUB” w warunku INNER JOIN to zły pomysł?

  4. Wskazówki, jak zmniejszyć złożoność SQL Server

  5. T-SQL:sprawdzanie formatu wiadomości e-mail