Apa itu statistik basis data, dan bagaimana saya bisa mendapat manfaat darinya?

18

Saya pernah mendengar menyebutkan statistik yang disimpan oleh SQL Server secara default. Apa yang mereka lacak, dan bagaimana saya bisa menggunakan informasi ini untuk meningkatkan basis data saya?

goric
sumber

Jawaban:

21

Statistik hanyalah bentuk metadata dinamis yang membantu pengoptimal kueri dalam membuat keputusan yang lebih baik. Misalnya, jika hanya ada selusin baris dalam sebuah tabel, maka tidak ada gunanya pergi ke indeks untuk melakukan pencarian; Anda akan selalu lebih baik melakukan pemindaian tabel penuh. Tetapi jika tabel yang sama tumbuh hingga sejuta baris, maka Anda mungkin akan lebih baik menggunakan indeks. Tetapi jika Anda kueri tabel itu pada kolom yang hanya memiliki sedikit nilai unik (misalnya itu mungkin kolom "jenis kelamin" yang hanya berisi "M" atau "F"), sebenarnya FTS mungkin lebih baik daripada kasus itu karena Anda ingin perlu mengambil blok pula untuk membangun set hasil. Sekarang katakanlah meja Anda adalah 99% "M" dan hanya 1% "F", kita harus FTS dalam satu kasus atau menggunakan indeks di yang lain. Tabel yang sama, permintaan yang sama, berpotensi empat rencana kueri yang berbeda tergantung pada konten tabel. Hal-hal semacam ini adalah "statistik" dan bersifat individual untuk setiap basis data - bahkan dua basis data dengan tabel dan struktur indeks yang sama akan memiliki statistik yang berbeda.

Singkatnya, dalam mesin basis data modern ada dua jenis optimasi kueri: menulis ulang SQL (optimasi berbasis aturan, seperti kompiler menulis ulang C Anda agar lebih efisien) dan memilih jalur data yang benar (optimasi berbasis biaya) , seperti kompiler JIT yang mengidentifikasi hotspot saat runtime). Anda hanya perlu khawatir tentang ini jika Anda melihat pengoptimal kueri melakukan sesuatu yang jelas salah (mis. Memilih FTS ketika Anda tahu indeks akan lebih baik).

Gayus
sumber
2
+1 Saya tidak bisa menjelaskannya dengan lebih baik. Penting untuk diingat bahwa statistik hanya membantu jika statistik selalu diperbarui. Ini dapat dilakukan dengan statistik pembaruan otomatis atau perintah statistik pembaruan yang dijadwalkan secara rutin (malam / mingguan). Juga, pembangunan kembali indeks akan secara otomatis melakukan pembaruan statistik.
Matt M
5

Mereka digunakan oleh optimiser kueri (whitepaper pada MSDN) untuk melacak distribusi nilai dalam indeks dan / atau kolom.

Satu - satunya masalah Anda adalah memperbarui secara berkala : biarkan mesin DB melakukan tugasnya

gbn
sumber
2
Tidak selalu. Ada kalanya membuat statistik secara manual dapat membantu permintaan kinerja.
mrdenny
@ Mrdenny: Seberapa sering Anda melakukan ini dalam kehidupan nyata? Sangat jarang. Saya belum IIRC. Jika perlu statistik, orang bisa berargumentasi bahwa itu membutuhkan indeks, yang tetap memiliki statistik. Anda hanya dapat membuat statistik kolom sesuai CREATE STATISTICS . Mengingat OP harus bertanya tentang statistik saya akan mengatakan ini adalah hal yang adil untuk dilakukan.
gbn
1
Saya sudah melakukannya beberapa kali, tetapi tidak sering. Saya menentang pernyataan "Satu-satunya masalah Anda adalah memperbarui secara teratur", karena memperbarui statistik bukanlah satu-satunya hal.
mrdenny