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

Perbarui jika berbeda/berubah

Selama kompilasi dan eksekusi kueri, SQL Server tidak meluangkan waktu untuk mengetahui apakah pernyataan UPDATE benar-benar akan mengubah nilai apa pun atau tidak. Itu hanya melakukan penulisan seperti yang diharapkan, bahkan jika tidak perlu.

Dalam skenario seperti

update table1 set col1 = 'hello'

Anda mungkin berpikir SQL tidak akan melakukan apa-apa, tetapi itu akan – ia akan melakukan semua penulisan yang diperlukan seolah-olah Anda benar-benar mengubah nilainya. Hal ini terjadi baik untuk tabel fisik (atau indeks berkerumun) serta indeks non-berkelompok yang ditentukan pada kolom itu. Ini menyebabkan penulisan ke tabel/indeks fisik, penghitungan ulang indeks, dan penulisan log transaksi. Saat bekerja dengan kumpulan data besar, ada manfaat kinerja yang sangat besar dengan hanya memperbarui baris yang akan menerima perubahan.

Jika kita ingin menghindari overhead penulisan ini saat tidak diperlukan, kita harus menemukan cara untuk memeriksa kebutuhan untuk diperbarui. Salah satu cara untuk memeriksa perlunya pembaruan adalah dengan menambahkan sesuatu seperti “where col <> 'hello'.

update table1 set col1 = 'hello' where col1 <> 'hello'

Tetapi ini tidak akan berjalan dengan baik dalam beberapa kasus, misalnya jika Anda memperbarui beberapa kolom dalam tabel dengan banyak baris dan hanya sebagian kecil dari baris tersebut yang benar-benar akan mengubah nilainya. Ini karena kebutuhan untuk memfilter semua kolom tersebut, dan predikat non-kesetaraan umumnya tidak dapat menggunakan pencarian indeks, dan overhead penulisan tabel &indeks dan entri log transaksi seperti yang disebutkan di atas.

Tetapi ada alternatif yang jauh lebih baik menggunakan kombinasi klausa EXISTS dengan klausa KECUALI. Idenya adalah untuk membandingkan nilai di baris tujuan dengan nilai di baris sumber yang cocok untuk menentukan apakah pembaruan benar-benar diperlukan. Lihat kueri yang dimodifikasi di bawah ini dan periksa filter kueri tambahan yang dimulai dengan EXISTS. Perhatikan bagaimana di dalam klausa EXISTS pernyataan SELECT tidak memiliki klausa FROM. Bagian itu sangat penting karena ini hanya menambahkan pemindaian konstan tambahan dan operasi filter dalam rencana kueri (biaya keduanya sepele). Jadi yang Anda dapatkan adalah metode yang sangat ringan untuk menentukan apakah UPDATE bahkan diperlukan sejak awal, menghindari overhead penulisan yang tidak perlu.

update table1 set col1 = 'hello'
/* AVOID NET ZERO CHANGES */
where exists 
    (
    /* DESTINATION */
    select table1.col1
    except
    /* SOURCE */
    select col1 = 'hello'
    )

Ini terlihat terlalu rumit vs memeriksa pembaruan dalam klausa WHERE sederhana untuk pemandangan sederhana dalam pertanyaan awal ketika Anda memperbarui satu nilai untuk semua baris dalam tabel dengan nilai literal. Namun, teknik ini bekerja sangat baik jika Anda memperbarui beberapa kolom dalam sebuah tabel, dan sumber pembaruan Anda adalah kueri lain dan Anda ingin meminimalkan entri log transaksi dan penulisan. Ini juga berkinerja lebih baik daripada menguji setiap bidang dengan <>.

Contoh yang lebih lengkap mungkin

update table1
   set col1 = 'hello',
       col2 = 'hello',
       col3 = 'hello'
/* Only update rows from CustomerId 100, 101, 102 & 103 */
where table1.CustomerId IN (100, 101, 102, 103)
/* AVOID NET ZERO CHANGES */
  and exists 
    (
    /* DESTINATION */
    select table1.col1
           table1.col2
           table1.col3
    except
    /* SOURCE */
    select z.col1,
           z.col2,
           z.col3
      from #anytemptableorsubquery z
     where z.CustomerId = table1.CustomerId
    )


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Membuat grup hari berturut-turut yang memenuhi kriteria tertentu

  2. Bagaimana cara menambahkan xml encoding <?xml version=1.0 encoding=UTF-8?> ke xml Output di SQL Server

  3. Bagaimana cara menambahkan login Sysadmin ke SQL Server?

  4. Jatuhkan tabel, lalu tidak dapat membuat ulang tabel dengan nama yang sama

  5. Cara Mengonversi Nilai Tanggal/Waktu menjadi String di SQL Server menggunakan CONVERT()