Seberapa deterministik pembuatan rencana eksekusi di SQL Server?

13

Diberikan konstanta berikut:

  • Basis data yang sama dengan struktur yang sama (tabel, indeks, dll)
  • Data yang sama
  • SQL Server dan konfigurasi perangkat keras yang sama
  • Statistik yang sama
  • Opsi SET yang sama di klien
  • Versi SQL Server yang sama
  • Bendera jejak yang sama

Dengan konstanta ini, apakah SQL Server akan selalu menghasilkan paket yang sama untuk permintaan yang diberikan?

Jika tidak, apakah ada pertimbangan lain? Apakah ada unsur nondeterminisme yang perlu dipertimbangkan juga?

James L.
sumber
itu akan salah untuk mengatakan rencana yang sama, tetapi kita dapat mengatakan rencana yang sama. Seiring dengan faktor-faktor eksternal yang DBA / Pengembang dapat kendalikan; "algoritma optimasi rencana kueri" dan "algoritma biaya kueri internal" ditulis di dalam mesin server SQL. kita tidak memiliki kendali untuk mengatakan "apa yang harus dipilih" dengan segala cara. kita dapat mengatur env eksternal untuk memandu mesin untuk memilih yang terbaik. untuk kueri yang diberikan jika optimizer telah datang dengan dua rencana eksekusi dengan katakanlah selisih biaya 0,001 maka saya kira itu tidak relevan apa rencana eksekusi yang dipilihnya.
Anup Shah
Saya tidak berpikir Anda harus teoritis tentang ini. Saya telah bekerja 25 tahun dengan database yang berbeda dan hampir selalu memungkinkan untuk menulis ulang kueri untuk dieksekusi lebih baik. Dan kadang-kadang sangat sulit untuk memahami mengapa lebih baik dengan satu cara menulis kueri.

Jawaban:

13

Dengan konstanta ini, apakah SQL Server akan selalu menghasilkan paket yang sama untuk permintaan yang diberikan? Jika tidak, apakah ada pertimbangan lain? Apakah ada unsur nondeterminisme yang perlu dipertimbangkan juga?

Kompilasi permintaan bersifat deterministik sejauh yang saya ketahui. Salah satu tujuan desain QO asli adalah bahwa itu harus memungkinkan untuk mereproduksi rencana eksekusi pada sistem yang berbeda menggunakan salinan database hanya statistik . Ada beberapa seluk-beluk untuk itu, di sekitar parameter konfigurasi seperti jumlah memori yang tersedia, dan jumlah prosesor logis, tetapi ini dicakup oleh daftar hal-hal yang akan disinkronkan.

Peringatan: Itu benar asalkan kata 'sama' dalam daftar Anda dianggap sama persis dalam semua hal . Sebagai contoh, statistik 'sama' mungkin ada pada kedua sistem, tetapi mereka hanya persis sama jika langkah histogram dan informasi kepadatan identik .

Yang mengatakan, proses optimisasi juga sangat kompleks , artinya bisa sulit untuk memastikan bahwa semua input untuk proses deterministik ini identik , dan bahwa semua keadaan internal cukup mirip untuk memastikan jalur kode yang sama diambil melalui pengoptimal untuk suatu tertentu kompilasi. Jika kueri berisi akses di luar database (ke database atau instance lain), lingkungan tersebut juga harus identik.

Satu hal yang akan saya tambahkan ke daftar Anda adalah untuk memeriksa apakah ada panduan paket di database kedua.


Penggunaan fungsi non-deterministik seperti GETDATE()dalam kueri mungkin berarti Anda mendapatkan paket yang berbeda juga. Sementara pengoptimal utama tidak menggunakan nilai secara langsung, estimasi kardinalitas dapat (lihat Lipat Konstan dan Evaluasi Ekspresi Selama Estimasi Kardinalitas ). Saya tidak yakin apakah kelas perbedaan ini termasuk dalam ruang lingkup pertanyaan, karena kedua sistem akan menghasilkan rencana yang sama jika dijalankan pada waktu yang sama (atau, lebih umum, dengan variabel input, parameter, dan nilai fungsi yang sama).

Paul White 9
sumber