Saat mendiagnosis SQL Server 2008 R2 kueri dengan estimasi kardinalitas yang buruk (meskipun pengindeksan sederhana, statistik terbaru, dll.) Dan karenanya rencana kueri yang buruk, saya menemukan artikel KB yang mungkin terkait: FIX: Kinerja buruk ketika Anda menjalankan kueri yang berisi predikat berkorelasi DAN di SQL Server 2008 atau di SQL Server 2008 R2 atau di SQL Server 2012
Saya bisa menebak apa yang dimaksud artikel KB dengan "berkorelasi", misalnya predikat # 2 dan predikat # 1 sebagian besar menargetkan baris yang sama.
Tapi saya tidak tahu bagaimana SQL Server tahu tentang korelasi ini. Apakah tabel memerlukan indeks multi-kolom yang berisi kolom dari kedua predikat? Apakah SQL menggunakan statistik untuk memeriksa apakah nilai dari satu kolom berkorelasi dengan yang lain? Atau apakah ada metode lain yang digunakan?
Saya menanyakan ini karena dua alasan:
- untuk menentukan tabel dan kueri mana yang mungkin diperbaiki menggunakan perbaikan terbaru ini
- untuk mengetahui apa yang harus saya lakukan dalam pengindeksan, statistik, dll untuk mempengaruhi # 1
sumber
Statistics objects on multiple columns also store statistical information about the correlation of values among the columns
Jawaban:
Pertimbangkan permintaan dan rencana eksekusi AdventureWorks sederhana yang ditunjukkan di bawah ini. Kueri berisi predikat yang terhubung dengan
AND
. Perkiraan kardinalitas pengoptimal adalah 41.211 baris:Menggunakan statistik default
Diberikan hanya statistik satu kolom, optimizer menghasilkan estimasi ini dengan memperkirakan kardinalitas untuk setiap predikat secara terpisah, dan mengalikan selektivitas yang dihasilkan secara bersamaan. Heuristik ini mengasumsikan bahwa predikat sepenuhnya independen.
Memisahkan kueri menjadi dua bagian membuat perhitungan lebih mudah dilihat:
Tabel Riwayat Transaksi berisi 113.443 baris secara total, sehingga estimasi 68.336.4 mewakili selektivitas 68336.4 / 113443 = 0.60238533 untuk predikat ini. Estimasi ini diperoleh dengan menggunakan informasi histogram untuk
TransactionID
kolom, dan nilai konstan yang ditentukan dalam kueri.Predikat ini memiliki perkiraan selektivitas 68413.0 / 113443 = 0.60306056 . Sekali lagi, dihitung dari nilai konstan predikat dan histogram dari
TransactionDate
objek statistik.Dengan asumsi predikat sepenuhnya independen, kita dapat memperkirakan selektivitas dua predikat bersama dengan mengalikannya bersama. Perkiraan kardinalitas akhir diperoleh dengan mengalikan selektivitas yang dihasilkan dengan 113.443 baris dalam tabel dasar:
Setelah pembulatan, ini adalah perkiraan 41.211 yang terlihat dalam kueri asli (pengoptimal juga menggunakan matematika floating point secara internal).
Bukan perkiraan yang bagus
The
TransactionID
danTransactionDate
kolom memiliki korelasi yang erat di AdventureWorks data yang ditetapkan (sebagai monoton meningkat kunci dan tanggal kolom sering). Korelasi ini berarti bahwa asumsi independensi dilanggar. Sebagai akibatnya, rencana kueri pasca-eksekusi menunjukkan 68.095 baris daripada yang diperkirakan 41.211:Lacak bendera 4137
Mengaktifkan tanda jejak ini mengubah heuristik yang digunakan untuk menggabungkan predikat. Alih-alih mengasumsikan independensi penuh, pengoptimal menganggap bahwa selektivitas dari dua predikat cukup dekat sehingga cenderung berkorelasi:
Ingat bahwa
TransactionID
predikat saja diperkirakan 68.336,4 baris danTransactionDate
predikat sendiri diperkirakan 68.413 baris. Pengoptimal memilih yang lebih rendah dari dua perkiraan ini daripada mengalikan selektivitas.Ini hanya heuristik yang berbeda, tentu saja, tetapi yang dapat membantu meningkatkan taksiran untuk kueri dengan
AND
predikat berkorelasi . Setiap predikat dipertimbangkan untuk kemungkinan korelasi, dan ada penyesuaian lain yang dibuat ketika banyakAND
klausa terlibat, tetapi contoh itu berfungsi untuk menunjukkan dasar-dasar itu.Statistik multi-kolom
Ini dapat membantu dalam kueri dengan korelasi, tetapi informasi histogram masih didasarkan hanya pada kolom utama dari statistik. Oleh karena itu, statistik multi-kolom kandidat berikut berbeda dalam cara yang penting:
Mengambil hanya satu dari itu, kita dapat melihat bahwa satu-satunya informasi tambahan adalah tingkat tambahan dari kepadatan 'semua'. Histogram masih hanya berisi informasi terperinci tentang
TransactionDate
kolom.Dengan statistik multi-kolom ini tersedia ...
... rencana eksekusi menunjukkan perkiraan yang persis sama dengan ketika hanya statistik satu kolom yang tersedia:
sumber