Saya biasa melihat pengembang senior saya menggunakan WITH (NOLOCK) saat mengkueri di SQL Server dan bertanya-tanya mengapa mereka menggunakan. Sekarang saya menjelajahinya dan menemukan bahwa itu berguna untuk meningkatkan kinerja dalam menjalankan kueri . Namun, ada kerugian dalam menggunakannya. Kerugiannya adalah seseorang mungkin tidak yakin bahwa mereka mendapatkan data yang saat ini sedang diperbarui di Tabel, yaitu, Tanpa perlindungan kunci, Anda tidak dapat dijamin bahwa data tersebut tidak berubah selama kueri berjalan. Saya merujuk tautan ini dan menganggapnya cukup berguna.
Untuk meningkatkan performa kueri SQL, secara umum, pertimbangan pertama adalah membuat indeks. Faktanya, selain pembentukan indeks, ketika kita menempatkan perintah SQL, menambahkan bagian WITH (NOLOCK) ke sintaks dapat meningkatkan fenomena himpunan data yang DIKUNCI di lingkungan dengan sejumlah besar kueri online, sehingga meningkatkan kinerja kueri.
Namun, satu hal yang perlu diperhatikan adalah bahwa SQL SELECT dengan (NOLOCK) dapat menyebabkan pembacaan kotor.
Misalnya:
Karena SQL Server melakukan pemeriksaan konsistensi kunci yang sesuai. Untuk meningkatkan performa kueri database secara keseluruhan, tambahkan WITH (NOLOCK) ke akhir nama tabel dalam sintaks SELECT Anda, meskipun (NOLOCK) juga dapat diterima, tetapi Microsoft tetap merekomendasikan untuk menambahkan WITH.
Selain SELECT sederhana, Anda juga dapat menggunakan sintaks SELECT dengan JOIN. Tapi DELETE, INSERT, UPDATE, dan perintah lain yang memerlukan transaksi tidak bagus...
Beberapa file mengatakan bahwa efisiensi kueri SQL dapat ditingkatkan sebesar 33% dengan WITH (NOLOCK). Menambahkan WITH (NOLOCK) memberi tahu SQL Server bahwa perintah SELECT kita tidak perlu mempertimbangkan status kunci transaksi dari tabel saat ini, sehingga performa akan ditingkatkan secara signifikan, dan fenomena kunci sistem database akan berkurang secara signifikan (termasuk kunci buntu).
Satu hal yang perlu diperhatikan adalah bahwa karena WITH (NOLOCK) tidak memperhitungkan kunci transaksi dari tabel saat ini, jadi ketika ada beberapa data dalam beberapa fase transaksi (misalnya transaksi di beberapa tabel - > seperti sistem penarikan), WITH (NOLOCK) akan mengabaikan data yang saat ini sedang memproses proses transaksi...
Terus terang, yaitu saat menggunakan NoLock, memungkinkan membaca data yang telah dimodifikasi tetapi transaksi belum selesai. Oleh karena itu, jika Anda perlu mempertimbangkan integritas data transaksi secara real-time, sebaiknya Anda berpikir baik-baik untuk menggunakan WITH (NOLOCK).
Jika Anda tidak perlu mempertimbangkan transaksi, WITH (NOLOCK) mungkin menjadi referensi yang berguna.
Catatan 1: DENGAN ( < table_hint > ) Menentukan pemindaian tabel, satu atau beberapa indeks yang digunakan oleh pengoptimal kueri, Atau oleh pengoptimal kueri untuk memanfaatkan tabel data ini dan menggunakan mode kunci untuk pernyataan ini.
Catatan 2: WITH (NOLOCK) setara dengan READ UNCOMMITTED
Terakhir, mari kita bicara tentang beberapa perbedaan kecil antara nolock dan with(nolock): 1: Sinonim di SQL05, hanya dengan (nolock) yang didukung; 2: dengan (nolock) ditulis dengan sangat mudah dan kemudian tentukan indeksnya. Saat mengkueri pernyataan di seluruh server, Anda tidak dapat menggunakan dengan (nolock), hanya nolock Saat mengkueri di server yang sama, baik dengan (nolock) maupun nolock dapat digunakan Seperti apa Kode SQL pilih * dari [IP].a.dbo.table1 dengan (nolock) Ini akan meminta Anda dengan kesalahan select * dari a.dbo.table1 dengan (nolock) Ini akan berfungsi |