Halo lagi!
Kolega, pada hari terakhir bulan Januari, kami meluncurkan kursus
“Pengembang MS SQL Server” , sehubungan dengan yang kami dapatkan dari pelajaran terbuka bertema. Di dalamnya kita berbicara tentang bagaimana MS SQL Server mengeksekusi query SELECT, membahas urutan dan apa yang dianalisis, dan juga terjun sedikit ke dalam membaca rencana kueri.
Dosen -
Kristina Kucherova , arsitek model data di Sberbank Rusia.
Tujuan dan rute webinarTujuan-tujuan berikut ini ditetapkan pada awal webinar:
- Lihat bagaimana server mengeksekusi permintaan, dan mengapa ini terjadi dengan cara ini
- Belajar membaca rencana kueri.
Untuk mencapainya, guru menyiapkan rute yang sederhana namun efektif:
Mengapa saya memerlukan paket permintaan?Rencana kueri adalah alat yang sangat berguna, yang, sayangnya, banyak pengembang tidak menggunakannya. Sekilas, sepertinya tidak perlu tahu mekanisme permintaan itu. Namun, jika Anda memahami apa yang terjadi di dalam SQL Server, Anda dapat menulis kueri yang lebih efisien. Dan itu akan banyak membantu, misalnya, selama optimasi.
Bagaimana kita melihat kueri SELECT?Mari kita lihat seperti apa query SELECT:
PILIH [bidang1], [bidang2] ...
| Bidang apa yang kita pilih?
|
DARI [tabel]
| Dari mana?
|
WHERE [ketentuan]
| Dimana kondisinya
|
GROUP BY [bidang1]
| Kelompokkan menurut bidang
|
MEMILIKI [kondisi]
| Memiliki kondisi ini dan itu
|
PESANAN OLEH [field1]
| Pemesanan (sortir)
|
Bagaimana memahami ke mana harus mencari data?Hal pertama yang coba dipahami server ketika permintaan datang adalah ke mana harus mencari data. Perintah FROM menjawab pertanyaan ini, karena di sinilah kita akan memiliki daftar tabel (atau nama satu tabel).
Untuk lebih jelasnya, mari kita bayangkan bahwa server kami adalah semacam kepala pelayan, yang kami pesan untuk menjemput kami saat liburan. Dengan demikian, kepala pelayan mulai berpikir, tetapi di lemari apa hal-hal yang diperlukan (di meja mana Anda perlu mengambil data)? Dan agar kepala pelayan kami dapat dengan mudah menyelesaikan tugasnya, kami menggunakan FROM.
Bagaimana cara memahami data yang akan diambil?Katakanlah kepala pelayan menemukan lemari yang tepat dan membukanya. Tetapi hal-hal apa yang harus diambil? Mungkin kita akan pergi ke resor ski? Atau mungkin di pantai yang panas dan terik? Untuk membuat hal-hal kami cocok dengan cuaca, perintah WHERE berguna bagi kami, yang menentukan kondisi, yaitu, memungkinkan kami untuk menyaring data. Jika panas, kita ambil papan tulis, baju dan pakaian renang, jika dingin - sarung tangan, kaus kaki rajutan, sweater)).
Langkah selanjutnya adalah melampirkan data ini ke grup, yang terjadi dengan GROUP BY (kaus terpisah, kaus kaki terpisah). Menurut hasil pengelompokan, satu kondisi lagi dapat dikenakan menggunakan HAVING (misalnya, mencabut hal-hal yang tidak berpasangan). Pada akhirnya, kami menambahkan semuanya menggunakan ORDER BY, mendapatkan koper yang sudah jadi pada output, atau lebih tepatnya, blok data yang dipesan.

By the way, ada nuansa, tetapi terdiri dalam kenyataan bahwa ada perbedaan kondisi yang harus ditentukan di WHERE dan yang di HAVING. Tapi ini lebih baik dilihat di video.
Kami melanjutkan. Jalur eksekusi permintaan disimpan
sebagai rencana permintaan di cache, yaitu, kepala pelayan kami menuliskan semuanya, karena ia adalah kepala pelayan yang baik - bagaimana jika Anda ingin mengulangi pesanan Anda tahun depan? Dan rencana semacam itu, pada prinsipnya, mungkin banyak.
Jenis koneksi dalam paket kueriAda tiga koneksi yang mungkin Anda temui dalam hal permintaan:
- Nested Loop.
- Gabung bergabung.
- Hash bergabung.
Sebelum membahas masing-masing secara lebih rinci, mari kita rangkum mengapa kita harus membaca rencana kueri. Ini sebenarnya sangat berguna karena Anda akan belajar:
- indeks mana yang digunakan;
- dalam urutan apa gabung;
- apa yang dipilih dari buffer;
- berapa banyak server menghabiskan sumber daya pada operasi;
- apa perbedaan antara rencana hipotetis dan nyata.
Loop bersarangKatakanlah kita perlu menggabungkan data dari tabel yang berbeda. Mari kita sajikan tabel ini sebagai ... sejumlah kecil cokelat Skittles dan kemasan lengkap M&M.

Saat menghubungkan jenis Nested Loop, kami mengambil permen Skittles, dan kemudian kami mendapatkan permen buta dari paket M&M. Jika kami tidak menemukan permen dengan warna yang sama (ini adalah kondisi kami), kami mendapatkan yang berikutnya, yaitu ada payudara biasa. Akibatnya, kita dapat mengatakan bahwa koneksi Nested Loop lebih cocok untuk sejumlah kecil data. Jelas, jika ada banyak data, penghilang bukanlah pilihan terbaik.

Mari kita lihat tampilannya di panel SQL:
Gabung bergabungKoneksi digunakan untuk sejumlah besar data. Saat Anda memiliki gabungan Gabung, kedua tabel Anda memiliki indeks yang dengannya mereka dapat bergabung. Dalam hal permen, seolah-olah kita mengaturnya terlebih dahulu berdasarkan warna.
Ini terlihat seperti ini:


Gabung gabung baik dalam kasus berikut:
- set data besar;
- bidang koneksi yang sama dari jenis yang sama;
- bidang koneksi memiliki indeks.
Hash bergabungHash join digunakan untuk sejumlah besar data yang tidak disortir. Untuk bergabung dengan tabel dalam hal ini, Anda perlu membuat sesuatu yang meniru indeks.
Hash bergabung dengan contoh:

Untuk kejelasan, kami mengingat permen kami:

Penggunaan Hash join melibatkan 2 fase tindakan:
- Build - tabel hash dibangun di atas meja terkecil. Untuk setiap nilai dalam tabel No. 1, hash dipertimbangkan. Nilai disimpan dalam tabel hash, dan hash yang dihitung digunakan sebagai kunci.
- Probe. Untuk setiap baris dari tabel No. 2, nilai hash dihitung untuk bidang yang ditentukan dalam gabungan (operator =). Hash dicari di tabel hash, nilai bidang diperiksa.



Kapan hash bergabung adalah baik:
- kumpulan data besar;
- tidak ada indeks marjinal.
Poin penting: jika tidak ada cukup memori, rekaman akan masuk ke tempdb - ke disk.
Teman-teman, selain hal di atas, pelajaran terbuka juga termasuk poin menarik lainnya, yang paling baik dilihat dengan menonton video. Kami menyarankan untuk mengunjungi
Hari Terbuka kursus "Pengembang MS SQL Server", di mana Anda dapat menanyakan semua pertanyaan Anda kepada guru.
Guru PS
Kristina Kucherova berterima kasih kepada Jes Schultz Borland atas
presentasinya dengan Rencana Eksekusi PASS Summitt: The Secret to Query Tuning Success, yang digunakan dalam mempersiapkan pelajaran terbuka.