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

Bagaimana cara mengoptimalkan operasi Upsert (Update dan Insert) dalam paket SSIS?

Contoh paket menggunakan SSIS 2008 R2 yang disisipkan atau diperbarui menggunakan operasi batch:

Berikut adalah contoh paket yang ditulis dalam SSIS 2008 R2 yang menggambarkan cara melakukan penyisipan, pembaruan antara dua database menggunakan operasi batch.

  • Menggunakan OLE DB Command akan memperlambat operasi pembaruan pada paket Anda karena tidak melakukan operasi batch. Setiap baris diperbarui satu per satu.

Sampel menggunakan dua database yaitu Source dan Destination . Dalam contoh saya, kedua database berada di server tetapi logikanya masih dapat diterapkan untuk database yang berada di server dan lokasi yang berbeda.

Saya membuat tabel bernama dbo.SourceTable di basis data sumber saya Source .

CREATE TABLE [dbo].[SourceTable](
    [RowNumber] [bigint] NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [ModifiedOn] [datetime] NOT NULL,
    [IsActive] [bit] NULL
)

Juga, buat dua tabel bernama dbo.DestinationTable dan dbo.StagingTable di database tujuan saya Destination .

CREATE TABLE [dbo].[DestinationTable](
    [RowNumber] [bigint] NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [ModifiedOn] [datetime] NOT NULL
) 
GO

CREATE TABLE [dbo].[StagingTable](
    [RowNumber] [bigint] NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [ModifiedOn] [datetime] NOT NULL
) 
GO

Menyisipkan sekitar 1,4 juta baris dalam tabel dbo.SourceTable dengan nilai unik ke dalam RowNumber kolom. Tabel dbo.DestinationTable dan dbo.StagingTable kosong untuk memulai. Semua baris dalam tabel dbo.SourceTable memiliki bendera IsActive disetel ke false.

Membuat paket SSIS dengan dua manajer koneksi OLE DB, masing-masing terhubung ke Source dan Destination database. Merancang Aliran Kontrol seperti yang ditunjukkan di bawah ini:

  • Execute SQL Task pertama mengeksekusi pernyataan TRUNCATE TABLE dbo.StagingTable terhadap database tujuan untuk memotong tabel staging.

  • Bagian selanjutnya menjelaskan bagaimana Data Flow Task dikonfigurasi.

  • Execute SQL Task mengeksekusi pernyataan SQL yang diberikan di bawah ini yang memperbarui data di dbo.DestinationTable menggunakan data yang tersedia di dbo.StagingTable , dengan asumsi bahwa ada kunci unik yang cocok di antara kedua tabel tersebut. Dalam hal ini, kunci uniknya adalah kolom RowNumber .

Skrip yang akan diperbarui:

UPDATE      D 
SET         D.CreatedOn = S.CreatedOn
        ,   D.ModifiedOn = S.ModifiedOn 
FROM        dbo.DestinationTable D 
INNER JOIN  dbo.StagingTable S 
ON          D.RowNumber = S.RowNumber

Saya telah merancang Tugas Aliran Data seperti yang ditunjukkan di bawah ini.

  • OLE DB Source membaca data dari dbo.SourceTable menggunakan perintah SQL SELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1

  • Lookup transformation digunakan untuk memeriksa apakah nilai RowNumber sudah ada di tabel dbo.DestinationTable

  • Jika catatan tidak ada, itu akan diarahkan ke OLE DB Destination bernama sebagai Insert into destination table , yang menyisipkan baris ke dbo.DestinationTable

  • Jika catatan ada , itu akan diarahkan ke OLE DB Destination bernama sebagai Insert into staging table , yang menyisipkan baris ke dbo.StagingTable . Data dalam tabel staging ini akan digunakan dalam `Execute SQL Task kedua untuk melakukan pembaruan batch.

Untuk mengaktifkan beberapa baris lagi untuk Sumber OLE DB, saya menjalankan kueri di bawah ini untuk mengaktifkan beberapa catatan

UPDATE  dbo.SourceTable 
SET     IsActive = 1 
WHERE   (RowNumber % 9 = 1) 
OR      (RowNumber % 9 = 2)

Eksekusi pertama dari paket tampak seperti yang ditunjukkan di bawah ini. Semua baris diarahkan ke tabel tujuan karena kosong. Eksekusi paket di mesin saya memakan waktu sekitar 3 seconds .

Jalankan kueri jumlah baris lagi untuk menemukan jumlah baris di ketiga tabel.

Untuk mengaktifkan beberapa baris lagi untuk Sumber OLE DB, saya menjalankan kueri di bawah ini untuk mengaktifkan beberapa catatan

UPDATE  dbo.SourceTable 
SET     IsActive = 1 
WHERE   (RowNumber % 9 = 3) 
OR      (RowNumber % 9 = 5) 
OR      (RowNumber % 9 = 6) 
OR      (RowNumber % 9 = 7)

Eksekusi kedua dari paket tampak seperti yang ditunjukkan di bawah ini. 314,268 rows yang sebelumnya dimasukkan selama eksekusi pertama dialihkan ke tabel pementasan. 628,766 new rows langsung dimasukkan ke tabel tujuan. Eksekusi paket di mesin saya memakan waktu sekitar 12 seconds . 314,268 rows di tabel tujuan diperbarui di Tugas SQL Jalankan kedua dengan data menggunakan tabel pementasan.

Jalankan kueri jumlah baris lagi untuk menemukan jumlah baris di ketiga tabel.

Saya harap itu memberi Anda ide untuk mengimplementasikan solusi Anda.



  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 saya bisa menonaktifkan tabel pembaruan untuk semua pengguna?

  2. Cara paling efisien di SQL Server untuk mendapatkan tanggal dari tanggal + waktu?

  3. Hapus semua tampilan dari Sql Server

  4. Bentrokan Tipe Operan

  5. pemetaan data antara server yang sama tetapi database yang berbeda dengan nama tabel yang sama