Saya telah meneliti permintaan yang berjalan lambat di database kami, dan telah menyimpulkan bahwa ini adalah Masalah Kunci Ascending klasik. Karena baris baru disisipkan hampir secara konstan, dan sepotong SQL yang diberikan untuk menarik data terbaru dari DB berjalan setiap 30 menit, opsi pertama untuk memperbarui statistik setiap 30 menit terdengar seperti itu bisa menjadi pemborosan sumber daya.
Jadi, saya melihat ke Trace Flag 2389 yang pada prinsipnya harus membantu, namun itu membutuhkan kolom Leading untuk dicap sebagai Ascending, dan ketika saya menggunakan Trace Flag 2388 untuk memeriksa statistik indeks (PK), saya melihat bahwa kolom terkemuka sebenarnya dicap sebagai Stationary - karena untuk beberapa indeks PK pada tabel lain diperbarui pada saat yang sama.
Tampaknya tidak ada banyak panduan tentang apa yang menghasilkan branding Stationary, namun saya menemukan KB2952101 yang mengatakan jika kurang dari 90% insert lebih besar dari nilai maksimum yang lama, itu akan digolongkan sebagai Stationary. Semua sisipan kami adalah kiriman baru, dan kolom utama adalah kolom IDENTITAS bigint, jadi 100% sisipan harus lebih besar dari nilai maksimum sebelumnya.
Jadi pertanyaan saya adalah mengapa kolom akan dicap sebagai Stationary, padahal itu jelas Ascending?
Upaya sebelumnya untuk menyelesaikan masalah ini untuk beberapa harian yang menjalankan SQL (yang bekerja dengan sangat baik) menghasilkan pekerjaan yang diatur untuk memperbarui statistik untuk tabel ini setiap malam. Pembaruan tidak melakukan FULLSCAN, jadi mungkinkah pemindaian sampel terkadang melewatkan baris baru, sehingga tidak selalu muncul sebagai naik?
Satu-satunya hal lain yang dapat saya pikirkan yang dapat mempengaruhi hal ini, adalah bahwa kami memiliki pekerjaan arsip yang berjalan di belakang layar menghapus baris pada usia tertentu. Mungkinkah ini berdampak pada branding?
Servernya adalah SQL Server 2012 SP1.
Pembaruan : Lain hari, pembaruan statistik lainnya - pencitraan stasioner yang sama. Ada 28049 sisipan baru sejak pembaruan statistik sebelumnya. Setiap baris memiliki stempel waktu ketika dimasukkan, jadi jika saya memilih maks (id) dari tabel di mana stempel waktu <'20161102' Saya mendapatkan 23313455 Demikian pula, jika saya melakukan itu ketika statistik diperbarui hari ini, saya mendapatkan 23341504.
Perbedaan antara ini adalah 28049 sisipan baru, jadi seperti yang Anda lihat, semua sisipan baru diberi kunci naik baru (seperti yang diharapkan), menyarankan kolom terkemuka harus dicap sebagai naik bukan stasioner.
Selama periode yang sama, pekerjaan pengarsipan kami menghapus 213.629 baris (kami perlahan membersihkan data lama). Apakah ada kemungkinan bahwa pengurangan jumlah baris dapat berkontribusi pada pencitraan stasioner? Saya sudah menguji ini sebelumnya dan sepertinya tidak ada bedanya.
Pembaruan 2 : Satu hari lagi, pembaruan statistik lainnya, dan kolom sekarang ditandai sebagai Naik! Sesuai teori tentang penghapusan yang mempengaruhi hal ini, saya memeriksa persentase pembaruan yang disisipkan dibandingkan dengan yang dihapus, dan kemarin 13% adalah sisipan, sedangkan sisipan dua hari sebelumnya menyumbang sekitar 12%. Saya tidak berpikir itu memberi kita sesuatu yang konklusif.
Menariknya, tabel terkait yang mendapatkan rata-rata 4 baris yang dimasukkan untuk setiap baris dimasukkan ke dalam tabel utama ini, dan apakah statistiknya diperbarui pada saat yang sama, apakah kolom IDENTITAS PK-nya masih stasioner !?
Pembaruan 3 : Selama akhir pekan kami mendapatkan lebih banyak sisipan. Pagi ini kolom utama kembali ke Alat Tulis. Pada pembaruan statistik terakhir, kami memiliki 46840 sisipan dan hanya 34.776 yang dihapus.
Sekali lagi, yang menarik, tabel terkait yang saya sebutkan di atas sekarang memiliki kolom terkemuka bermerek Ascending. Apakah tidak ada dokumentasi yang dapat menjelaskan hal ini?
Pembaruan 4 : Sudah seminggu atau lebih sekarang, pekerjaan pengarsipan telah menghapus simpanan, jadi kami secara konsisten menghapus sekitar dua pertiga dari jumlah baris yang dimasukkan. Statistik menunjukkan hasil beragam di tabel terkait, dengan satu menunjukkan stasioner, dan dua menunjukkan naik, meskipun mereka semua diperbarui secara proporsional dengan cara yang sama.
Jawaban:
Itu akan bermerek stasioner jika, seperti yang telah Anda sebutkan, bahwa 10% atau lebih dari sisipan tidak naik. Jika 100% dari sisipan Anda seperti yang Anda katakan ... maka Anda mungkin tidak memiliki masalah ini, sampai tentu saja Anda menghapus tetapi kemudian akan kembali ke yang tidak diketahui.
Ini adalah repro masalah Anda:
sumber
Menurut perkiraan saya, kecuali jika Anda membuat kolom kunci utama di server itu sendiri, Anda bisa masuk ke lubang kecil dengan mengandalkan itu yang dihasilkan pada masing-masing klien.
Anda juga sudah mencoba Trace Flag 2371.
TF 2371 didokumentasikan di sini .
KB berjudul "Controlling Autostat (AUTO_UPDATE_STATISTICS) perilaku dalam SQL Server." dan KB adalah 2754171.
Ini akan sangat berguna jika Anda membuat daftar untuk kami dampak aktual dari data baru yang tidak masuk ke dalam statistik tepat waktu.
Indeks yang salah dipilih. Dan, jika demikian bisakah Anda membuat daftar untuk kami indeks dan kunci utamanya?
Juga, bisakah Anda membagikan rencana yang dihasilkan ketika statistik tanggal terhadap ketika mereka tepat waktu. Saya ingin membandingkan keduanya.
Pemikiran saya adalah bahwa keputusan Pengoptimal Berbasis Biaya (Aturan dan Penetapan Biaya) SQL cukup bagus; di luar area esoteris seperti ini.
Jika ini adalah kasus khusus, penjelasan lebih lanjut mungkin dapat membantu dan membenarkan membuka Item Hubungkan.
Selain itu, menurut pendapat saya, Anda akan memiliki manfaat keseluruhan yang lebih besar dalam membuat vendor menggunakan SP daripada ad-hoc SQL.
sumber