Apakah pengoptimal query database mengetahui perbedaan kinerja penyimpanan?

8

Seperti yang saya pahami, optimizer kueri di SQL Server (atau RDBMS lainnya, benar-benar) tidak menyadari kinerja penyimpanan di bawah database, dan akan membuat keputusan seolah-olah semua penyimpanan memiliki biaya yang sama. Apakah itu akurat, atau adakah pengetahuan tentang kinerja penyimpanan yang diperhitungkan?

Dalam contoh yang benar-benar dibuat, katakanlah baris tabel saya disimpan pada drive SSD di SAN saya dengan waktu akses instan, di mana indeks saya disimpan pada drive SAS yang sangat kelebihan beban, menghasilkan saturasi disk dan antrian disk yang konstan. Ketika RDBMS membuat rencana eksekusi, apakah itu lebih cenderung mendukung pemindaian tabel daripada operasi indeks (atau mungkin indeks kurus dan pencarian tabel terkait, yang bertentangan dengan indeks penutup, karena lebih sedikit IO pada disk SAS)?

Saya menduga jawabannya adalah solid "tidak ada peluang adalah pengoptimal yang pintar atau bahkan menyadari kinerja disk", tetapi saya hanya ingin melihat apakah ada orang di luar sana yang tahu pasti. Saya menggunakan SQL Server, tapi saya tertarik dengan sistem basis data apa pun.

SqlRyan
sumber
1
Pengoptimal MySQL juga tidak menyadari. Penyimpanan dapat berupa disk, ssd, koneksi jaringan-over-33.6kbps, dimanapun. Pengoptimal tidak memiliki petunjuk.
ypercubeᵀᴹ
3
Oracle menghasilkan "sistem statistik" yang mengukur (antara lain) latensi (dan kinerja) dari akses disk dan memasukkan nilai-nilai tersebut ke dalam rencana. Untuk Postgres Anda dapat secara manual menetapkan skala pada seberapa "mahal" operasi IO tertentu yang juga digunakan oleh perencana.
a_horse_with_no_name

Jawaban:

8

Pengoptimal kueri server Sql tidak mempertimbangkan variasi dalam kinerja disk saat menyusun rencana kueri. Paul White memberikan ikhtisar besar pengoptimal berbasis biaya Sql Server di sini:

https://sqlkiwi.blogspot.com/2010/09/inside-the-optimizer-plan-costing.html

Beberapa poin utama adalah:

  • Pengoptimal tidak mencoba menghitung biaya pasti dari suatu paket. Itu mencoba untuk memilih rencana dengan biaya terendah relatif antara beberapa alternatif.

  • Ini adalah pandangan yang disederhanakan dari kenyataan. Ini mengasumsikan server dapat melakukan 320 io / detik dan bahwa kinerja cpu tidak meningkat dalam lebih dari satu dekade.

  • Meskipun server saat ini memiliki karakteristik kinerja yang sangat berbeda, pengoptimal masih melakukan pekerjaan yang sangat baik di sebagian besar kasus.

Jadi, mengapa Microsoft tidak menambahkan beberapa intelijen tambahan ke pengoptimal? Namun, di masa depan mereka mungkin, apa yang lebih mungkin adalah perubahan kecil terhadap biaya iterator individu. Saat ini manfaatnya tidak ada untuk membenarkan upaya.

Anda dapat menggunakan panggilan dbcc tidak berdokumen untuk mengubah beberapa asumsi pengoptimal kueri. JANGAN GUNAKAN INI PADA SERVER PRODUKSI

DBCC SETIOWEIGHT(<multiplier>)
DBCC SETCPUWEIGHT(<multiplier>)

Keduanya memiliki nilai default 1. Bermain dengan mereka dan lihat apakah Anda dapat menemukan nilai yang berbeda yang secara konsisten menghasilkan rencana yang lebih baik di sebagian besar kasus. Anda akan menemukan bahwa perubahan kecil tidak akan mengubah sebagian besar paket dan perubahan besar akan menghasilkan paket yang benar-benar aneh.

Satu poin tambahan adalah bahwa sementara SQL tidak mempertimbangkan kinerja io ketika menyusun rencana, ia merespons kinerja io selama pelaksanaan rencana (membatasi baca-baca berbunyi jika io jenuh, dll.)

StrayCatDBA
sumber
Ini informasi yang bagus - terima kasih! Ini mengkonfirmasi kecurigaan yang saya miliki, dan kedua perintah DBCC itu menyenangkan untuk dimainkan dengan mesin sandbox yang saya miliki :)
SqlRyan
0

Pengoptimal permintaan Db2 untuk LUW mengetahui karakteristik kinerja perangkat keras dari mesin yang sedang berjalan dan mempertimbangkannya.

Secara khusus, setiap tablespace memiliki dua parameter numerik yang mencerminkan kinerja penyimpanan yang mendasarinya:, overheadyang mencerminkan overhead pengontrol I / O dan pencarian disk serta waktu laten dalam milidetik, dan transferrate, yang menunjukkan waktu yang diperlukan untuk mentransfer satu halaman tablespace dari disk ke memori.

Parameter ini dapat ditentukan pada waktu pembuatan tablespace untuk mengesampingkan nilai default turunan heuristik.

Parameter kinerja I / O, bersama dengan cpu_speedparameter level manajer basis data, digunakan oleh pengoptimal untuk menghitung biaya I / O dan CPU dari masing-masing operator paket kueri dan karenanya akan memengaruhi rencana mana yang akhirnya dipilih. Selanjutnya, skenario Anda akan sepenuhnya masuk akal di Db2. Demikian pula, pada sistem dengan kecepatan CPU yang sangat tinggi dan kinerja disk biasa, optimizer mungkin lebih suka operator intensif CPU (mis. Pemindaian tabel plus pengurutan) daripada yang lebih intensif I / O (mis. Akses tabel berbasis indeks).

Saya percaya Db2 untuk z / OS juga menjelaskan karakteristik kinerja perangkat keras yang mendasarinya, mendapatkannya dari lapisan manajemen penyimpanan, bukan sebagai bagian dari konfigurasi basis data.

mustaccio
sumber