Query SQL sederhana tidak selesai [ditutup]

8

Saya tidak tahu bagaimana merumuskan pertanyaan karena kami belum tahu banyak, tetapi saya ingin bertanya lebih cepat daripada nanti karena ini terlihat seperti sesuatu yang tidak boleh diabaikan.

Minggu ini kami mulai mengalami masalah dengan server database kami. Tampaknya menjadi masalah konsistensi data dan memanifestasikan oleh batas waktu bahkan pada kueri yang sangat sederhana dan tabel kecil. Kami "memperbaiki" masalah dengan me-restart server awal minggu ini dan itu hilang, tetapi sekarang tampaknya sudah kembali dan kali ini pada tabel yang lebih penting. Sebagai contoh, saya baru saja melakukan investigasi dan saya melihat pertanyaan seperti ini:

SELECT * FROM table WHERE id = 1234

untuk ID tertentu. Tabel ini memiliki sekitar 30+ juta baris. Tetapi tampaknya itu terjadi hanya untuk sebagian kecil catatan. Saya yakin ketika saya me-restart server atau cadangan dan mengembalikan database di server lain, semuanya akan baik-baik saja. Tapi saya akan coba.

Pada titik ini, saya sedang menjalankan:

DBCC CHECKTABLE ('table', NOINDEX)

tapi sepertinya itu akan berjalan selamanya. Ketika kami mengalami masalah pertama kali, saya memeriksa meja yang menyinggung dan itu baik-baik saja. Meja baru ini jauh lebih besar.

Beberapa informasi teknis latar belakang:

  • SQL Server 2008 R2, Windows Server 2008 R2
  • AWS / EC2, m2.2xlarge, 32 GB RAM, 4 x 1TB RAID 0
  • hampir tidak ada disk IO, tampaknya sebagian besar db ada di memori
  • ukuran total db: 100GB

Volume ELB "baru". Kami menciptakannya minggu ini.

Sunting: Saya baru saja menggunakan perintah berikut:

SELECT
    sqltext.TEXT,
    req.session_id,
    req.blocking_session_id,
    req.wait_type,
    req.wait_time,
    req.last_wait_type,
    req.wait_resource,
    req.open_transaction_count,
    req.transaction_id,
    req.total_elapsed_time
FROM
    sys.dm_exec_requests req
CROSS APPLY
    sys.dm_exec_sql_text(req.sql_handle) AS sqltext

dan menemukan bahwa permintaan saya menunggu kunci bersama (LCK_M_S) di mana sesi pemblokiran sedang menunggu kunci bersama lainnya diblokir oleh sesi yang tidak ada.

Sunting 2: OK, sesi ada (saya menemukannya menggunakan sys.dm_exec_sessions), tetapi tampaknya tidak melakukan apa-apa sekarang.

Sunting 3: Saya tidak dapat menemukan sesuatu yang menarik tentang sesi ini. Saya melihat dari mana server web itu berasal, tetapi tidak banyak lagi.

Sunting 4: Sunting 4: Kami menemukan kemungkinan bug dalam kode kami: fungsi yang tidak memastikan koneksi basis data ditutup. Di sisi lain, itu tampak seperti transaksi fungsi yang digunakan dulu dibuang dengan benar dalam hal ini semua kunci harus dibersihkan. Ini masih belum begitu jelas bagi saya, tetapi sepertinya itulah alasannya. Kami akan memperbaiki bug dan mengawasi itu.

Jan Zich
sumber

Jawaban:

4

Bagi saya masalah ini disebabkan oleh koneksi basis data yang dibiarkan terbuka oleh Visual Studio dijeda dalam mode debug. Menghentikan proses debug memungkinkan pertanyaan selesai dengan segera.

Lunster
sumber
2

Apa jenis tunggu untuk kueri saat digantung? Ini akan memberi tahu Anda apa yang ditunggu. Pergi mencari dan menginstal sp_whoisactive di server dan menjalankan prosedur tersimpan ketika Anda memiliki masalah. Ini akan menunjukkan Anda spid dan memberi Anda jenis menunggu.

Kemungkinan Anda diblokir oleh seseorang yang menulis ke baris itu, atau baris lain pada halaman itu atau Anda menunggu disk untuk merespons.

mrdenny
sumber
0

Coba jalankan DBCC CHECKDBpada masalah DB dan tunggu sampai selesai. Jika ada inkonsistensi data fisik yang menghasilkan perilaku aneh, maka terlalu berbahaya untuk bekerja dengan DB ini karena Anda dapat kehilangan semua data Anda.

  1. Lakukan pencadangan sesegera mungkin.
  2. Periksa DB.

TAPI

Jika tabel memiliki kolom BLOB dengan jumlah data yang relatif besar, itu benar-benar normal bahwa pemeriksaan terhadap tabel ini harus memakan waktu lama.

Oleg Dok
sumber
0

tidak benar-benar yakin apa yang Anda harapkan sebagai jawaban tetapi jika tabel memiliki 30+ juta baris, diharapkan bahwa perintah DBCC akan berjalan untuk waktu yang lama.

Ketika Anda mengatakan:

Tetapi tampaknya itu terjadi hanya untuk sebagian kecil catatan

Maksud Anda, Anda khawatir seluruh tabel tidak akan dipindai? Itu normal jika Anda memiliki indeks pada ID, indeks akan dipindai yang akan menghasilkan lebih sedikit pembacaan.

Diego
sumber