Saya telah menemukan banyak informasi tentang apa STATISTICS
itu: bagaimana mereka dikelola, bagaimana mereka dapat dibuat secara manual atau otomatis dari permintaan atau indeks, dan sebagainya. Tapi, saya tidak mampu menemukan setiap bimbingan atau "praktek terbaik" informasi mengenai kapanuntuk membuatnya: situasi apa yang lebih diuntungkan dari objek STATISTIK yang dibuat secara manual daripada dari Indeks. Saya telah melihat statistik yang difilter secara manual dibuat membantu kueri pada tabel yang dipartisi (karena statistik yang dibuat untuk indeks mencakup seluruh tabel dan tidak per partisi - brillaint!), Tetapi tentunya harus ada skenario lain yang akan mendapat manfaat dari objek statistik sementara tidak membutuhkan detail indeks, juga tidak sebanding dengan biaya mempertahankan indeks atau meningkatkan kemungkinan pemblokiran / dead-lock.
@JonathanFite, dalam komentar, menyebutkan perbedaan antara indeks dan statistik:
Indeks akan membantu SQL menemukan data lebih cepat dengan membuat pencarian yang diurutkan secara berbeda dari tabel itu sendiri. Statistik membantu SQL menentukan berapa banyak memori / upaya yang diperlukan untuk memenuhi permintaan.
Itu info hebat, terutama karena itu membantu saya mengklarifikasi pertanyaan saya:
Bagaimana mengetahui ini (atau info teknis lainnya pada apa s dan bagaimana s terkait dengan perilaku dan sifat STATISTICS
) bantuan menentukan kapan untuk memilih CREATE STATISTICS
lebih CREATE INDEX
, terutama saat membuat Indeks akan membuat terkait STATISTICS
objek? Skenario apa yang lebih baik dilayani dengan hanya memiliki info STATISTIK dan tidak memiliki Indeks?
Akan sangat membantu, jika mungkin, memiliki contoh skenario yang berfungsi di mana STATISTICS
objek lebih cocok daripada sebuah INDEX
.
Karena saya seorang pembelajar / pemikir visual, saya pikir mungkin membantu untuk melihat perbedaan antara STATISTICS
dan INDEX
, berdampingan, sebagai cara yang mungkin untuk membantu menentukan kapan STATISTICS
pilihan yang lebih baik.
Thingy PROs CONs
------- ---------- -------------------
INDEX * Can help sorts. * Takes up space.
* Contains data (can * Needs to be maintained (extra I/O).
"cover" a query). * More chances for blocking / dead-locks.
STATISTICS * Takes up very little space. * Cannot help sorts.
* Lighter maintenance / won't * Cannot "cover" queries.
slow down DML operations.
* Does not increase chances
of blocking / dead-locks.
Berikut ini adalah beberapa sumber yang saya temukan ketika mencari ini, yang bahkan menanyakan pertanyaan yang sama, tetapi tidak dijawab:
Indeks SQL Server vs Statistik
Pertanyaan SQL Server Statistics Kami terlalu malu untuk bertanya
Statistik. Mungkinkah histogram multikolom?
** Untuk lebih jelasnya, saya tidak punya jawaban untuk ini dan saya benar-benar mencari untuk mendapatkan umpan balik dari semoga beberapa orang untuk memberikan apa yang tampaknya ada informasi aneh yang hilang di sini di dalam jalinan.
sumber
Jawaban:
Pertanyaan Anda berputar di sekitar - Kapan sebaiknya membuat statistik vs buat indeks (yang membuat statistik).
Dari catatan internal server sql saya (SQLSkills class- IE1 dan IE2) dan buku internal SQL Server , di bawah ini adalah pemahaman saya yang terbatas :
Statistik SQL Server hanyalah objek sistem yang berisi informasi penting tentang nilai kunci indeks dan nilai kolom biasa.
SQL Server menggunakan model berbasis biaya untuk memilih rencana eksekusi "cukup baik" secepat mungkin. Perkiraan cardanility (memperkirakan jumlah baris yang akan diproses pada setiap langkah eksekusi kueri) adalah faktor paling penting dalam optimasi kueri yang inturn mempengaruhi strategi bergabung, persyaratan hibah memori, pemilihan utas pekerja serta pilihan indeks saat mengakses data .
SQL Server tidak akan menggunakan indeks nonclustered ketika memperkirakan bahwa tidak ada yang besar. dari operasi loopup KEY atau RID akan diperlukan, sehingga mempertahankan statistik pada indeks (dan pada kolom) yang akan membantu dalam estimasi tersebut.
Ada 2 hal penting tentang statistik:
Histogram menyimpan info tentang distribusi data untuk kolom statistik (indeks) paling kiri HANYA. Itu juga menyimpan info tentang kepadatan multi kolom dari nilai-nilai kunci. Jadi pada dasarnya, histogram menyimpan distribusi data hanya untuk kolom statistik paling kiri.
SQL Server akan mempertahankan paling banyak 200 langkah dalam histogram terlepas dari ukuran tabel. Interval yang dicakup oleh setiap langkah histogram bertambah saat tabel tumbuh yang mengarah ke statistik "kurang akurat" untuk tabel besar.
Ingat bahwa selektivitas indeks adalah metrik yang berbanding terbalik dengan kepadatan, yaitu semakin tinggi nilai kolom, semakin tinggi selektivitasnya.
Ketika kueri tertentu tidak berjalan terlalu sering, Anda dapat memilih untuk membuat statistik tingkat kolom daripada indeks. Statistik tingkat kolom membantu Pengoptimal Kueri menemukan rencana eksekusi yang lebih baik, meskipun rencana eksekusi tersebut tidak optimal karena pemindaian indeks yang terlibat. Pada saat yang sama, statistik tidak menambahkan overhead selama operasi modifikasi data, dan mereka membantu menghindari pemeliharaan indeks. Pendekatan ini hanya berfungsi untuk kueri yang jarang dieksekusi.
Merujuk:
Catatan: Seseorang seperti Paul White atau Aaron Bertrand dapat berpadu untuk memberikan lebih banyak warna pada pertanyaan bagus Anda .
sumber
Saya akan mengatakan Anda perlu indeks ketika Anda harus dapat membatasi jumlah data / sampai ke data yang benar dengan cepat berdasarkan bidang (s).
Anda memerlukan statistik saat Anda membutuhkan pengoptimal untuk memahami sifat data untuk dapat melakukan operasi dengan cara terbaik.
Apa yang telah saya ketahui, statistik yang difilter membantu ketika Anda memiliki kemiringan dalam data Anda yang sangat memengaruhi rencana, misalnya dalam stack overflow beberapa pengguna memiliki jumlah posting yang sangat besar, jadi hanya menggunakan rata-rata posting per pengguna bukanlah estimasi terbaik. Jadi Anda bisa membuat statistik yang difilter pada userId berdasarkan pada nama pengguna dan kemudian SQL Server harus tahu bahwa ketika nama pengguna ini ada dalam kueri, ini adalah id pengguna yang akan didapatnya, dan ia harus bisa mengetahui, bahwa bidang yang diindeks dalam tabel posting akan memiliki sejumlah besar baris dengan id itu karena histogram ada di sana. Dengan rata-rata, itu tidak mungkin dilakukan.
sumber
UserID
berada dalam kondisi BERGABUNG, bahkan jika tidak dalamWHERE
? Dan bukankah itu cukup bagus untuk mengambil Indeks yang difilter?WHERE BitColumn = 0
tidak akan dipilih untuk permintaan sederhanaWHERE BitColumn <> 1
. (Dan untuk menjadi jelas, kolom bit tidak dapat dibatalkan.) Saya pikir ada kasus serupa sepertiIntColumn > 10
tidak cocokIntColumn >= 11
.Dari 70-461 buku Pelatihan oleh Itzik Ben-Gan
Hanya ada beberapa kemungkinan alasan untuk membuat statistik secara manual. Salah satu contoh adalah ketika predikat kueri berisi beberapa kolom yang memiliki hubungan lintas-kolom; statistik pada banyak kolom dapat membantu meningkatkan rencana kueri. Statistik pada banyak kolom berisi kepadatan lintas-kolom yang tidak tersedia dalam statistik satu kolom. Namun, jika kolom sudah dalam indeks yang sama, objek statistik multikolom sudah ada, jadi Anda tidak harus membuat satu tambahan secara manual.
sumber