Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Sisipan Massal SQL Server – Bagian 2

Di bagian sebelumnya dari artikel ini, kami membahas cara mengimpor file CSV ke SQL Server dengan bantuan pernyataan BULK INSERT. Kami membahas metodologi utama proses penyisipan massal dan juga detail opsi BATCHSIZE dan MAXERRORS dalam skenario. Pada bagian ini, kita akan membahas beberapa opsi lain (FIRE_TRIGGERS, CHECK_CONSTRAINTS dan TABLOCK) dari proses penyisipan massal dalam berbagai skenario.

Skenario 1:Bisakah kita mengaktifkan pemicu di tabel tujuan selama operasi penyisipan massal?

Secara default, selama proses penyisipan massal, pemicu penyisipan yang ditentukan dalam tabel target tidak diaktifkan, namun, dalam beberapa situasi kita mungkin ingin mengaktifkan pemicu ini. Solusi untuk masalah ini adalah dengan menggunakan opsi FIRE_TRIGGERS dalam pernyataan penyisipan massal. Saya ingin menambahkan pemberitahuan bahwa opsi ini dapat memengaruhi dan menurunkan kinerja operasi penyisipan massal karena pemicu/pemicu dapat membuat operasi terpisah dalam database. Dalam contoh berikut, kami akan menunjukkan ini. Pada awalnya, kami tidak akan menyetel parameter FIRE_TRIGGERS dan proses penyisipan massal tidak akan mengaktifkan pemicu penyisipan. Dalam skrip T-SQL berikut, kami akan menentukan pemicu penyisipan untuk tabel Penjualan.

DROP TABLE JIKA ADA Penjualan CREATE TABLE [dbo].[Penjualan]( [Region] [varchar](50) , [Negara] [varchar](50) , [ItemType] [varchar](50) NULL, [ SalesChannel] [varchar](50) NULL, [OrderPriority] [varchar](50) NULL, [OrderDate] datetime, [OrderID] bigint NULL, [ShipDate] datetime, [UnitSold] float, [UnitPrice] float, [UnitCost] float, [TotalRevenue] float, [TotalCost] float, [TotalProfit] float) DROP TABLE JIKA ADA SalesLogCREATE TABLE SalesLog (OrderIDLog bigint)GOCREATE TRIGGER OrderLogIns ON SalesFOR INSERTASBEGIN SET NOCOUNT ON INSERT INSERT INTO SalesLogSELECT OrderICSERTend INTO Catatan Penjualan.csv'WITH (FIRSTROW =2, FIELDTERMINATOR =',', ROWTERMINATOR='\n' ); PILIH Hitungan(*) DARI SalesLog

Seperti yang Anda lihat di atas, pemicu penyisipan tidak menyala karena kami tidak menyetel opsi FIRE_TRIGGERS. Sekarang, kita akan menambahkan opsi FIRE_TRIGGERS ke pernyataan penyisipan massal sehingga opsi ini memungkinkan untuk menyisipkan pemicu kebakaran.

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

Skenario 2:Bagaimana cara mengaktifkan batasan pemeriksaan selama operasi penyisipan massal?

Batasan pemeriksaan memungkinkan kami menerapkan integritas data dalam tabel SQL Server. Tujuan dari batasan adalah untuk memeriksa nilai yang dimasukkan, diperbarui, atau dihapus sesuai dengan aturan sintaksisnya. Seperti, batasan NOT NULL menyatakan bahwa kolom tertentu tidak dapat dimodifikasi oleh nilai NULL. Sekarang, kita akan fokus pada kendala dan interaksi penyisipan massal. Secara default, selama proses penyisipan massal, semua pemeriksaan dan batasan kunci asing diabaikan, tetapi opsi ini memiliki beberapa pengecualian. Menurut dokumentasi Microsoft “kendala UNIQUE dan PRIMARY KEY selalu ditegakkan. Saat mengimpor ke kolom karakter  yang batasan NOT NULL ditentukan, BULK INSERT menyisipkan string kosong saat tidak ada nilai dalam file teks.” Dalam skrip T-SQL berikut, kami akan menambahkan batasan centang ke kolom OrderDate yang mengontrol tanggal pemesanan lebih besar dari 01.01.2016.

DROP TABLE JIKA ADA Penjualan CREATE TABLE [dbo].[Penjualan]( [Region] [varchar](50) , [Negara] [varchar](50) , [ItemType] [varchar](50) NULL, [ SalesChannel] [varchar](50) NULL, [OrderPriority] [varchar](50) NULL, [OrderDate] datetime, [OrderID] bigint NULL, [ShipDate] datetime, [UnitSold] float, [UnitPrice] float, [UnitCost] float, [TotalRevenue] float, [TotalCost] float, [TotalProfit] float) ALTER TABLE [Penjualan] 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 Sales WHERE OrderDate <'20160101'

Seperti yang Anda lihat pada contoh di atas, proses penyisipan massal melewatkan kontrol batasan pemeriksaan. Namun, SQL Server menunjukkan batasan pemeriksaan sebagai tidak tepercaya.

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

Nilai ini menunjukkan bahwa seseorang memasukkan atau memperbarui beberapa data ke kolom ini dengan melewatkan batasan pemeriksaan, pada saat yang sama kolom ini mungkin berisi data yang tidak konsisten dengan referensi batasan itu. Sekarang, kami akan mencoba mengeksekusi pernyataan penyisipan massal dengan opsi CHECK_CONSTRAINTS. Hasilnya sangat sederhana, cek kendala mengembalikan kesalahan karena data yang tidak tepat.

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

Skenario 3:Bagaimana cara meningkatkan kinerja dalam beberapa penyisipan massal ke dalam satu tabel tujuan?

Tujuan utama dari mekanisme penguncian di SQL Server adalah untuk melindungi dan memastikan integritas data. Dalam konsep utama artikel penguncian SQL Server, Anda dapat menemukan detail tentang mekanisme penguncian. Sekarang, kami akan fokus pada detail penguncian proses penyisipan massal. Jika Anda menjalankan pernyataan penyisipan massal tanpa opsi TABLELOCK, itu memperoleh kunci baris atau tabel menurut hierarki kunci. Namun, dalam beberapa kasus, kami mungkin ingin menjalankan beberapa proses penyisipan massal terhadap satu tabel tujuan, sehingga kami dapat mengurangi waktu operasi penyisipan massal. Pada awalnya, kami akan mengeksekusi dua pernyataan penyisipan massal secara bersamaan dan menganalisis perilaku mekanisme penguncian. Kami akan membuka dua jendela kueri di SQL Server Management Studio dan menjalankan pernyataan penyisipan massal berikut secara bersamaan.

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

Saat kami menjalankan kueri dmv (Dynamic Management View) berikut, yang membantu memantau status proses penyisipan massal.

SELECT session_id,command ,status,last_wait_type,text FROM sys.dm_exec_requests cross apply sys.dm_exec_sql_text(sys.dm_exec_requests.sql_handle)dengan teks seperti '%BULK INSERT Sales%' dan session_id
@@SPID

Seperti yang Anda lihat pada gambar di atas, sesi 61, status proses penyisipan massal ditangguhkan karena penguncian. Jika kami memverifikasi masalah, sesi 59 mengunci tabel tujuan penyisipan massal dan sesi 61 menunggu pelepasan kunci ini untuk melanjutkan proses penyisipan massal. Sekarang, kami akan menambahkan opsi TABLOCK ke pernyataan penyisipan massal dan menjalankan kueri.

Saat menjalankan kueri pemantauan dmv lagi, kami tidak dapat melihat proses penyisipan massal yang ditangguhkan karena SQL Server menggunakan jenis kunci khusus yang disebut kunci pembaruan massal (BU). Jenis kunci ini memungkinkan untuk memproses beberapa operasi penyisipan massal terhadap tabel yang sama secara bersamaan dan opsi ini juga mengurangi total waktu proses penyisipan massal.

Saat kami menjalankan kueri berikut selama proses penyisipan massal, kami dapat memantau detail penguncian dan jenis penguncian.

Pre> Pilih dm_tran_locks.request_session_id, dm_tran_locks.resource_database_id, db_name (dm_tran_locks.resource_name, dM), dm1, casing, 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_idWHERE resource_associated_entity_id> 0 AND resource_database_id =DB_ID()

Kesimpulan

Pada artikel ini, kami menjelajahi semua detail operasi penyisipan massal di SQL Server. Khususnya, kami menyebutkan perintah BULK INSERT dan pengaturan serta opsinya, dan kami juga menganalisis berbagai skenario yang mendekati masalah kehidupan nyata.

 

Referensi

MASUKKAN MASSAL (Transact-SQL)

Prasyarat untuk Masuk Minimal dalam Impor Massal

Mengontrol Perilaku Penguncian untuk Impor Massal

Bacaan Lebih Lanjut

Mengekspor Data ke Flat File dengan BCP Utility dan Mengimpor data dengan Massal Insert

Alat yang berguna:

dbForge Data Pump – add-in SSMS untuk mengisi database SQL dengan data sumber eksternal dan memigrasikan data antar sistem.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana SCHEMA_ID() Bekerja di SQL Server

  2. Cara meneruskan array string dalam parameter SQL ke klausa IN dalam SQL

  3. Ubah 'waktu' menjadi 'waktu kecil' di SQL Server (Contoh T-SQL)

  4. Cara Membuat Kunci Asing Komposit di SQL Server (Contoh T-SQL)

  5. Kapan performa Distinct dan Group By berbeda?