SSMS
 sql >> Teknologi Basis Data >  >> Database Tools >> SSMS

Perkiraan kardinalitas buruk berasal dari rencana eksekusi SSMS

Saya harus berterima kasih kepada beberapa orang untuk pembaruan terbaru ke SQL Sentry Plan Explorer. Brooke Philpott (@Macromullet) dan Greg Gonzalez (blog | @SQLsensei), tentu saja, untuk R &D dan untuk menggali kode dan memilahnya. Tetapi juga kepada Paul White (blog | @SQL_kiwi) karena gigih dalam membantu kami memvalidasi perbaikan.

Masalah yang ditemukan Paul adalah bahwa SQL Server 2008+ mengacaukan perkiraan kardinalitas pada kueri tertentu ketika pencarian kunci atau RID terlibat. Saya akan menyerahkan penjelasan yang lebih dalam ke posting blog Paul dan bug yang dia ajukan di Connect, tetapi singkatnya, kami mengambil perkiraan yang salah mengartikan ini, mempercayainya, dan mengekstrapolasinya untuk menunjukkan kepada Anda informasi yang "lebih baik". Sayangnya, seperti yang dijelaskan Paul, kami ditipu.

Paul menunjukkan kueri berikut terhadap salinan AdventureWorks 2005.

SELECT
    th.ProductID,
    th.TransactionID,
    th.TransactionDate
FROM Production.TransactionHistory AS th 
WHERE 
    th.ProductID = 1 
    AND th.TransactionDate BETWEEN '20030901' AND '20031231';

Management Studio menghasilkan rencana berikut, seperti yang dijelaskan Paul:

Di Plan Explorer, kami mencoba membantu dengan mengalikan perkiraan jumlah baris (dibulatkan menjadi 17) dengan jumlah eksekusi (45), dan menghasilkan 765:

Untuk sebagian besar operator, pendekatan ini menghasilkan data yang benar, tetapi karena bug ini di SQL Server, ini tidak benar untuk pencarian kunci/RID. Kami telah menyesuaikannya, dan merilis perbaikan yang sesuai di 7.2.42.0 (unduh sekarang!). Rencana grafis sekarang dengan benar menunjukkan jumlah baris yang benar untuk kedua perkiraan:

Dan sebenarnya:

Saya akan mengulangi peringatan Paul:Hati-hati dengan perkiraan kardinalitas yang buruk saat predikat diterapkan sebagai bagian dari pencarian.

Ada beberapa masalah yang lebih kompleks yang disebabkan oleh perkiraan yang menyesatkan ini, yang juga telah kami bahas. Saya akan menulis blog tentang beberapa di antaranya dalam posting lanjutan – untuk posting ini saya hanya ingin menunjukkan bahwa kami dengan cepat menyelesaikan masalah spesifik yang disoroti Paul dalam postingnya.


  1. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. Powershell:Pembuat Skrip SQL Server Management Studio

  2. Tidak dapat mengaktifkan SQL Server atau menyambung ke mesin basis data lokal saya melalui SSMS

  3. Arti kata-kata yang diwarnai dengan Biru dan Merah Muda di MSQLSMS

  4. Nama Objek Tidak Valid - Prosedur Tersimpan

  5. Tidak dapat terhubung ke SQL Server express dari SSMS