Apakah mungkin untuk memberikan pengoptimal lebih banyak atau sepanjang waktu yang dibutuhkan?

18

Mengingat pengoptimal tidak dapat mengambil semua waktu yang diperlukan (harus meminimalkan waktu eksekusi dan tidak berkontribusi untuk itu) untuk mengeksplorasi semua rencana eksekusi yang mungkin kadang-kadang terputus.

Saya bertanya-tanya apakah ini dapat diganti sehingga Anda dapat memberikan pengoptimal setiap saat dalam kebutuhan (atau jumlah milidetik tertentu).

Saya tidak memiliki kebutuhan untuk ini (atm) tetapi saya dapat membayangkan skenario di mana query yang kompleks dieksekusi dalam loop yang ketat dan Anda ingin membuat rencana optimal dan menyimpannya terlebih dahulu.

Tentu saja Anda memiliki loop ketat Anda harus menulis ulang kueri sehingga hilang tetapi tetap bersamaku.

Ini lebih merupakan pertanyaan karena penasaran dan juga untuk melihat apakah kadang-kadang ada perbedaan antara optimasi hubung singkat dan penuh.

Ternyata Anda dapat memberi pengoptimal lebih banyak waktu dengan jejak bendera 2301. Bukan itu yang saya tanyakan tetapi mendekati.

Informasi terbaik yang saya temukan dalam hal ini adalah di Query Processor Extensions Modeling di SQL Server 2005 SP1 oleh Ian Jose.

Gunakan bendera jejak ini dengan hati-hati! Tapi itu bisa berguna ketika membuat rencana yang lebih baik. Lihat juga:

Saya sedang memikirkan pertanyaan dengan banyak gabungan di mana ruang solusi untuk pesanan gabungan meledak secara eksponensial. Heuristik yang digunakan SQL Server cukup bagus tetapi saya bertanya-tanya apakah optimizer akan mengusulkan urutan yang berbeda jika memiliki lebih banyak waktu (dalam kisaran detik atau bahkan menit).

buckley
sumber

Jawaban:

16

Di sebelah jejak bendera 2301, ada 8780 yang benar-benar membuat pengoptimal 'bekerja lebih keras' karena hanya memberikan lebih banyak waktu (tidak terbatas, seperti dijelaskan secara rinci di sini (Rusia) dan kurang rinci di sini ) untuk melakukan hal tersebut.

Penjelasan terperinci dalam bahasa Inggris dari penulis asli artikel rusia. yang termasuk peringatan penulis sendiri:

tidak disarankan untuk menggunakannya dalam produksi .

Menggabungkan keduanya dan menerapkannya (sangat selektif melalui petunjuk permintaan OPSI (QUERYTRACEON 2301, QUERYTRACEON 8780) ke permintaan TVFs inline bersarang 4 tingkat (di mana hanya yang di bawah akan melakukan pekerjaan nyata dan tingkat atas akan mengkorelasikan hasil melalui subqueries EXISTS) menghasilkan GABUNGAN GABUNGAN yang bagus dan beberapa SPEK LAZ yang mengurangi waktu eksekusi hingga setengahnya.

ENOTTY
sumber
4

Tidak, kamu tidak bisa.

Anda dapat membuat pertanyaan "ramah pengoptimal" dengan memahami cara kerjanya (binatang buas yang kompleks, tidak perlu mengetahuinya dari dalam ke luar). Saya akan menyarankan bahwa jika Anda sesuatu yang sangat penting saat ini, maka perbaiki kueri daripada mengubah cara SQL Server beroperasi.

Misalnya, Anda ingin tahu kapan kueri mulai penskalaan kurang efisien daripada O (n) karena volume data + distribusi data berubah: memberi lebih banyak waktu kepada pengoptimal tidak menambah nilai di sini.

gbn
sumber