Bagaimana cara membunuh / menghentikan kueri SQL yang panjang dengan segera?

97

Saya menggunakan SQL server 2008 dan studio manajemennya. Saya mengeksekusi kueri yang menghasilkan banyak baris. Saya mencoba membatalkannya melalui tombol batal merah, tetapi tidak berhenti selama 10 menit terakhir. Biasanya berhenti dalam 3 menit.

Apa alasannya dan bagaimana cara menghentikannya segera?

sequel.learner
sumber
Sudahkah Anda memeriksa bahwa ada aplikasi yang menahan kueri ini ??
pengguna1102001
1
berhenti dan mulai ulang layanan sql Anda lagi ..
user1102001
saya telah menghadapi senario ini karena saya menjalankan semuanya di sql dan itu keinginan saya untuk mengedit proflie saya atau tidak ...
user1102001
@ user1102001 - tidak memaksa Anda untuk melakukan apa pun. Saya bilang bisa dan tidak harus :)
sequel.learner

Jawaban:

65

Apa alasannya

Pembatalan kueri segera dilakukan, asalkan perhatian Anda dapat mencapai server dan diproses. Kueri harus dalam keadaan dapat dibatalkan, yang hampir selalu benar kecuali jika Anda melakukan operasi tertentu seperti memanggil layanan web dari SQLCLR. Jika perhatian Anda tidak dapat mencapai server, itu biasanya karena penjadwal kelebihan beban.

Tetapi jika kueri Anda adalah bagian dari transaksi yang harus dibatalkan, maka rollback tidak dapat dihentikan. Jika dibutuhkan 10 menit maka itu perlu 10 menit dan tidak ada yang dapat Anda lakukan. Bahkan me-restart server tidak akan membantu, itu hanya akan membuat startup lebih lama karena pemulihan harus menyelesaikan rollback.

Untuk menjawab alasan spesifik mana yang berlaku untuk kasus Anda, Anda harus menyelidikinya sendiri.

Remus Rusanu
sumber
Perhatikan bahwa SSMS menampilkan kueri sebagai 'dibatalkan' (Berbeda dengan 'mencoba membatalkan') hanya setelah balasan perhatian diterima, yang berarti menguras semua hasil perantara di pipa komunikasi terlebih dahulu (mis. Semua hasil di TCP / IP buffer kirim / terima dan semua buffer dalam memori).
Remus Rusanu
1
Saya berharap itu akan mengatakan 'bergulir kembali'
Simon_Weaver
@RemusRusanu - Bagaimana jika perkiraan waktu rollback adalah 20.000+ jam? Senang memulihkan dari cadangan. dba.stackexchange.com/questions/222145/…
youcantryreachingme
111
sp_who2 'active'

Periksa nilai di bawah CPUTime dan DiskIO . Perhatikan SPID proses yang memiliki nilai besar secara komparatif.

kill {SPID value}
Mudassir Hasan
sumber
Saya menggunakan Microsoft SQL Server 2008 R2, saya mencoba untuk mencari tahu apa itu SPID dari kueri yang sedang dijalankan dan ditangguhkan, dan menemukan bahwa ada banyak contoh dari SELECT SQL yang sama yang memiliki SPID yang sama. Ketika saya mencoba menjalankan perintah KILL 114 - di sini 114 adalah nilai SPID dari kueri yang ditangguhkan. Saya mendapatkan error shon di bawah ini: Mohon panduannya. Psn 102, Level 15, Status 1, Baris 2 Sintaks salah dekat '114'.
Code Buster
42

Pertama jalankan perintah di bawah ini:

sp_who2

Setelah itu jalankan perintah di bawah ini dengan SPID, yang Anda dapatkan dari perintah di atas:

KILL {SPID value}
pengguna1608817
sumber
23

Ini adalah jenis jawaban yang konyol, tetapi bekerja dengan andal setidaknya dalam kasus saya: Di studio manajemen, ketika "Batalkan Kueri Pelaksana" tidak menghentikan kueri, saya cukup mengklik untuk menutup dokumen sql saat ini. itu menanyakan saya apakah saya ingin membatalkan kueri, saya mengatakan ya, dan lihatlah dalam beberapa detik itu berhenti mengeksekusi. Setelah itu saya ditanya apakah saya ingin menyimpan dokumen sebelum menutup. Pada titik ini saya dapat mengklik Batal agar dokumen tetap terbuka dan terus bekerja. Tidak tahu apa yang terjadi di balik layar, tetapi tampaknya berhasil.

anakic
sumber
5
Dalam hal ini kueri mungkin sebenarnya masih berjalan / menggantung di latar belakang, Anda tidak akan melihatnya lagi.
Aries51
1
Saya pikir itu mematikan koneksi, karena Anda harus menyambung kembali setelah ini.
anakic
2
Ini mematikan koneksi ke SSMS tetapi tidak (harus) ke db.
Aries51
1
Saya memang mencoba ini sql saya digantung. T_T
bot
1
Jika Anda tidak dapat melihatnya, itu tidak ada.
ChrisD
14

Jika Anda membatalkan dan melihat lari itu

 sp_who2 'active'

(Monitor Aktivitas tidak akan tersedia di sql server 2000 FYI lama)

Temukan SPID yang ingin Anda bunuh, misalnya 81

Kill 81

Jalankan sp_who2 'active' lagi dan Anda mungkin akan melihatnya sedang tidur ... berguling kembali

Untuk menjalankan STATUS kembali, PEMBUNUHAN

Kill 81 

Kemudian Anda akan mendapatkan pesan seperti ini

 SPID 81: transaction rollback in progress. Estimated rollback completion: 63%. Estimated time remaining: 992 seconds.
Tom Stickel
sumber
Saya harus lari KILL {spid} WITH STATUSONLYuntuk melihat pesan status.
Rudey
11

Anda dapat menggunakan pintasan keyboard ALT+ Breakuntuk menghentikan eksekusi kueri. Namun, ini mungkin tidak berhasil di semua kasus.

Yash Saraiya
sumber
1
Yang ini bekerja untuk saya di studio Manajemen. Terima kasih
Vishvanathsinh Solanki
5
--Find Session Id for respective all running queries
SELECT text, getdate(),*
 FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)

---Kill specific session
kill 125
Jai Nath Gupta
sumber
1
Tambahkan beberapa penjelasan pada jawaban Anda dengan mengeditnya sehingga orang lain dapat mempelajarinya
Nico Haase
2

rupanya di sql server 2008 r2 64bit, dengan kueri yang berjalan lama dari IIS, kill spid tampaknya tidak berfungsi, kueri hanya akan dimulai ulang lagi dan lagi. dan tampaknya menggunakan kembali spid. kueri menyebabkan sql server mengambil 35% cpu terus-menerus dan situs web hang. Saya menduga bc / itu tidak dapat menanggapi pertanyaan lain untuk masuk

Joseph McKinley
sumber
2
Saya ingin melihat sumber untuk ini.
Ant Swift
1

Di bagian saya, sql saya menutup telepon ketika saya mencoba menutupnya sambil terus berlari. Jadi yang saya lakukan adalah membuka pengelola tugas saya dan mengakhiri tugas kueri sql saya. Ini menghentikan sql saya dan memulainya kembali.

bot
sumber
1

Jawaban sederhana, jika kotak merah "stop" tidak berfungsi, adalah dengan mencoba menekan tombol "Ctrl + Break" pada keyboard.

Jika Anda menjalankan SQL Server di Linux, ada sebuah aplikasi yang dapat Anda tambahkan ke systray Anda yang disebut "killall". Cukup klik tombol "killall" lalu klik program yang terperangkap dalam loop dan program akan dihentikan. Semoga membantu.

Aubrey Love
sumber
1

Saya telah menderita hal yang sama sejak lama. Ini terutama terjadi ketika Anda terhubung ke server jarak jauh (Yang mungkin lambat), atau Anda memiliki koneksi jaringan yang buruk. Saya ragu apakah Microsoft tahu jawaban yang benar.

Tapi sejak saya mencoba mencari solusinya. Hanya 1 pendekatan awam yang berhasil

  • Klik tombol tutup di atas tab kueri yang Anda derita. Setelah beberapa saat (Jika Microsoft tidak kasar pada Anda !!!) Anda mungkin mendapatkan jendela yang menanyakan hal ini

"Kueri sedang dijalankan. Apakah Anda ingin membatalkan kueri?"

  • Klik "Ya"

  • Setelah beberapa saat akan menanyakan apakah Anda ingin menyimpan kueri ini atau tidak?

  • Klik "Batal"

Dan setelah itu, semoga studio Anda stabil lagi untuk menjalankan kueri Anda.

Apa yang dilakukannya di latar belakang adalah memutuskan jendela kueri Anda dengan koneksi. Jadi untuk menjalankan kueri lagi, perlu waktu untuk menyambungkan kembali server jarak jauh. Tapi percayalah pada saya pertukaran ini jauh lebih baik daripada penderitaan melihat timer yang berjalan untuk selamanya.

PS: Ini bekerja untuk saya, Kudos jika bekerja untuk Anda juga. !!!

Maulik Modi
sumber
1
Masih berhasil untuk saya dan memecahkan masalah saya pada ->
ErocM