Cara melacak kueri SQL yang menabrak SQL Server

9

Kami memiliki server database SQL Server 2008 (kebetulan berjalan di bawah MS Failover Clustering, tapi saya tidak berpikir itu relevan di sini).

Aplikasi kami menjalankan Hibernate untuk akses DB, dan karena kami meningkatkan baru-baru ini dari v3.1 ke 3.6, kami telah mengalami SQL Server crashing secara teratur (setiap 24-48 jam, tetapi kadang-kadang lebih sering).

Masalah spesifik yang dimaksud tampaknya terkait dengan memori. Tepat sebelum server crash (dan kemudian restart secara otomatis oleh failover cluster manager), kami mendapatkan banyak kesalahan ini:

Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.

juga pesan sesekali (tetapi reguler) dari

Error: 17300, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.

Kesalahan: 17312, Tingkat Permasalahan: 16, Negara: 1. (Params :). Kesalahan dicetak dalam mode singkat karena ada kesalahan selama pemformatan. Tracing, ETW, notifikasi dll dilewati.

Saya juga mendapatkan beberapa kesalahan tingkat aplikasi seperti

java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.

dan kemudian kesalahan yang menarik dan mungkin bersifat instruktif:

The query processor ran out of internal resources and could not produce a query plan. 
This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. 
Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

Beban di server tidak berubah sehingga tidak ada alasan sekarang seharusnya kehabisan memori ketika sebelumnya tidak menunjukkan masalah dengan permintaan yang dikirim ke sana.

Sekarang untuk pertanyaan - bagaimana cara melacak kueri yang menyebabkan kesalahan ini (dan dengan demikian mungkin semua masalah)? Sepertinya sejak upgrade Hibernate kami, telah meluncurkan beberapa pertanyaan besar di SQL Server, dan itu rusak. Ketika itu terjadi, saya memiliki beberapa ide tentang apa yang mungkin terjadi, tetapi akan baik untuk dapat melacaknya.

Saya tentu saja dapat menjalankan profiler SQL Server, tetapi setelah ini dilakukan (dan menghasilkan sejumlah besar data - ini adalah database OLTP yang sibuk), bagaimana cara saya memfilter untuk menemukan pertanyaan yang bermasalah?

Terima kasih!

Pete Storey
sumber
1
Apakah semuanya berjalan di server yang sama? Artinya, apakah server aplikasi, dengan java, juga berjalan di server database?
swasheck
1
Terkait dengan pertanyaan @ swasheck: Apakah Anda memiliki nilai eksplisit yang ditetapkan untuk SQL Server max memory? Sudahkah Anda mengesampingkan tekanan memori eksternal?
Mike Fal
Sudahkah Anda mencoba melihat jejak kotak hitam? Mereka mungkin mengarahkan Anda ke arah yang benar.
datagod
Saya baru saja menekan hal ini, dan jejak yang saya tinggalkan berjalan menunjukkan database yang menganggur dari perspektif aplikasi.
Joshua
Apakah Anda menggunakan pencarian teks lengkap? Juga, apa edisi + sql server no no build tepatnya yang Anda jalankan?
Kin Shah

Jawaban:

5

Ikuti langkah-langkah yang dijelaskan di Cara menggunakan DBCC MEMORYSTATUSperintah untuk memantau penggunaan memori pada SQL Server . Tindakan pemulihan akan tergantung pada temuan Anda. Anda juga dapat membaca Cara Mengidentifikasi Kemacetan Memori Microsoft SQL Server yang lebih mudah diakses.

Satu kata peringatan: tidak mungkin Anda akan menemukan pertanyaan individu untuk disalahkan. Melacak masalah memori lebih halus dari itu. Perlu diingat bahwa saat Anda kehabisan sumber daya dan kueri melempar kesalahan kehabisan memori, mungkin kueri yang melempar kesalahan hanyalah korban , bukan pelakunya.

Remus Rusanu
sumber
Terima kasih - Saya sudah melihat yang sudah, tetapi masalahnya adalah bahwa server tampaknya berfungsi dengan baik dan kemudian tiba-tiba meledak, tidak secara bertahap kehabisan memori. Juga tidak jelas dari apa pun yang dapat saya temukan online apa kesalahannya "Ada memori sistem tidak mencukupi dalam sumber daya 'internal' untuk menjalankan permintaan ini." sebenarnya berarti - apa kumpulan sumber daya internal sehubungan dengan hasil dari DBCC MEMORYSTATUS?
Apakah ini server pengembangan? Jika demikian, dapatkah Anda menurunkan versi ke Hibernate 3.1 untuk memverifikasi masalah hilang? Anda memiliki dua baris awal penyelidikan dan Anda harus mencoba untuk menghilangkan salah satunya, baik SQL Server memiliki batas memori yang ditetapkan dan melebihi mereka atau beberapa bagian lain dari sistem mengkonsumsi memori dan SQL Server sedang diperas. Profil sistem sekitar waktu kecelakaan untuk menentukan mana yang terjadi.
epo
0

Sepertinya Anda ingin pergi untuk Extended Eventskonfigurasi menggunakan acara query_memory_grant_xxxxx.

Ini adalah pilihan terbaik bagi Anda untuk mencatat informasi dan menyimpan SQL Engine ukuran luar yang dapat Anda baca kapan saja (Anda juga dapat menonton data langsung), informasi yang disimpan tidak akan terhapus ketika server restart terjadi tidak seperti DMVs

Langkah-langkah pengaturan cepat ..

Shekar Kola
sumber