Saya kira pertanyaan sebenarnya adalah:
Jika saya tidak peduli dengan pembacaan yang kotor, akan menambahkan petunjuk with (NOLOCK) ke pernyataan SELECT mempengaruhi kinerja:
- pernyataan SELECT saat ini
- transaksi lainnya terhadap tabel yang diberikan
Contoh:
Select *
from aTable with (NOLOCK)
sql
sql-server
locking
Bob Probst
sumber
sumber
Jawaban:
1) Ya , pilih dengan
NOLOCK
akan menyelesaikan lebih cepat dari pilih normal.2) Ya , pilih dengan
NOLOCK
akan memungkinkan kueri lain terhadap tabel yang dilakukan untuk menyelesaikan lebih cepat dari pilih normal.Mengapa ini terjadi?
NOLOCK
biasanya (tergantung pada mesin DB Anda) berarti memberi saya data Anda, dan saya tidak peduli keadaan apa itu, dan jangan repot-repot menahannya saat Anda membaca dari itu. Semuanya sekaligus lebih cepat, kurang intensif sumber daya, dan sangat sangat berbahaya.Anda harus diperingatkan untuk tidak pernah melakukan pembaruan dari atau melakukan sistem apa pun kritis, atau di mana kebenaran mutlak diperlukan menggunakan data yang berasal dari
NOLOCK
membaca. Sangat mungkin bahwa data ini berisi baris yang telah dihapus selama menjalankan kueri atau yang telah dihapus di sesi lain yang belum selesai. Ada kemungkinan bahwa data ini termasuk baris yang sebagian telah diperbarui. Ada kemungkinan bahwa data ini berisi catatan yang melanggar batasan kunci asing. Ada kemungkinan bahwa data ini mengecualikan baris yang telah ditambahkan ke tabel tetapi belum dilakukan.Anda benar-benar tidak memiliki cara untuk mengetahui status data.
Jika Anda mencoba untuk mendapatkan hal-hal seperti Row Row atau data ringkasan lainnya di mana beberapa margin kesalahan dapat diterima, maka itu
NOLOCK
adalah cara yang baik untuk meningkatkan kinerja untuk kueri ini dan menghindarinya berdampak negatif terhadap kinerja database.Selalu gunakan
NOLOCK
petunjuk dengan sangat hati-hati dan memperlakukan data apa pun yang dikembalikan dengan mencurigakan.sumber
NOLOCK membuat sebagian besar pernyataan SELECT lebih cepat, karena kurangnya kunci bersama. Juga, kurangnya penerbitan kunci berarti bahwa penulis tidak akan terhalang oleh SELECT Anda.
NOLOCK secara fungsional setara dengan tingkat isolasi dari READ UNCOMMITTED. Perbedaan utama adalah bahwa Anda dapat menggunakan NOLOCK pada beberapa tabel tetapi tidak pada yang lain, jika Anda mau. Jika Anda berencana untuk menggunakan NOLOCK pada semua tabel dalam kueri yang kompleks, maka menggunakan SET TINGKAT ISOLASI TRANSAKSI BACA TIDAK DIKOMPITASI lebih mudah, karena Anda tidak harus menerapkan petunjuk ke setiap tabel.
Berikut adalah informasi tentang semua tingkat isolasi yang Anda inginkan, serta petunjuk tabel.
SET TINGKAT ISOLASI TRANSAKSI
Petunjuk Tabel (Transact-SQL)
sumber
Selain apa yang dikatakan di atas, Anda harus sangat menyadari bahwa nolock sebenarnya membebankan risiko Anda tidak mendapatkan baris yang telah dilakukan sebelum Anda memilih.
Lihat http://blogs.msdn.com/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx
sumber
Ini akan lebih cepat karena tidak harus menunggu kunci
sumber
Jawabannya adalah Ya jika kueri dijalankan beberapa kali sekaligus, karena setiap transaksi tidak perlu menunggu yang lain selesai. Namun, jika kueri dijalankan sekali sendiri maka jawabannya adalah Tidak.
Ya . Ada kemungkinan signifikan bahwa penggunaan DENGAN (NOLOCK) yang cermat akan mempercepat keseluruhan basis data Anda. Ini berarti bahwa transaksi lain tidak harus menunggu sampai pernyataan SELECT ini selesai, tetapi di sisi lain, transaksi lain akan melambat karena mereka sekarang berbagi waktu pemrosesan dengan transaksi baru.
Berhati-hatilah hanya menggunakan
WITH (NOLOCK)
pernyataan SELECT pada tabel yang memiliki indeks berkerumun.WITH (NOLOCK) sering dieksploitasi sebagai cara ajaib untuk mempercepat transaksi baca database.
Rangkaian hasil dapat berisi baris yang belum dikomit, yang sering kali dibatalkan.
Jika WITH (NOLOCK) diterapkan ke tabel yang memiliki indeks non-clustered maka baris-indeks dapat diubah oleh transaksi lain karena data baris sedang dialirkan ke tabel hasil. Ini berarti bahwa set hasil dapat berupa baris yang hilang atau menampilkan baris yang sama beberapa kali.
READ COMMITTED menambahkan masalah tambahan di mana data rusak dalam satu kolom di mana banyak pengguna mengubah sel yang sama secara bersamaan.
sumber