Telah didokumentasikan dengan cukup baik bahwa skalar UDF memaksa keseluruhan rencana seri.
Menjalankan fungsi secara paralel
Mengingat sejumlah besar baris masuk ke suatu titik dalam pipa di mana UDF harus dihitung, mengapa mesin tidak bisa hanya mendistribusikannya di antara prosesor? Jika tidak ada keadaan dalam UDF maka perintah itu seharusnya tidak masalah.
Ada klaim tentang UDF sebagai kotak hitam yang harus menggunakan kursor. Saya bisa melihat bahwa kursor pengguna tidak dapat diparalelkan dalam SP untuk kasus-kasus di mana beberapa negara dipertahankan di antara iterasi tetapi sepertinya harus diparalelkan sebaliknya.
Poin ekstra untuk menjelaskan mengapa mesin memaksa keseluruhan rencana menjadi serial, bukan hanya tahap perhitungan UDF.
Apakah dukungan untuk UDF paralel merupakan fitur yang wajar untuk diminta?
sumber
Jawaban:
Saya tidak yakin semuanya terdokumentasi dengan baik.
Lihat Memaksa Rencana Eksekusi Paralel dan / atau presentasi Eksekusi Paralel Craig Freedman .
Klaim ini tidak benar.
Pemahaman saya adalah bahwa pembatasan saat ini adalah murni hasil dari detail implementasi tertentu. Tidak ada alasan mendasar mengapa fungsi tidak dapat dieksekusi menggunakan paralelisme.
Secara khusus, fungsi skalar T-SQL dijalankan di dalam konteks T-SQL yang terpisah, yang memperumit operasi, koordinasi, dan shutdown yang benar (terutama dalam kasus kesalahan) secara signifikan.
Sama halnya, variabel tabel mendukung pembacaan paralel (tetapi tidak menulis) secara umum, tetapi variabel tabel yang diekspos oleh fungsi bernilai tabel tidak dapat mendukung pembacaan paralel karena alasan implementasi spesifik. Anda akan membutuhkan seseorang dengan akses kode sumber (dan kebebasan untuk berbagi detail) untuk memberikan jawaban yang berwibawa, saya khawatir.
Tentu saja, jika Anda dapat membuat kasus yang cukup kuat. Perasaan saya sendiri adalah bahwa pekerjaan yang terlibat akan luas, sehingga proposal Anda harus memenuhi standar yang sangat tinggi. Misalnya, permintaan terkait (dan lebih sederhana) untuk menyediakan fungsi skalar sebaris memiliki dukungan besar, tetapi telah mendekam tidak diterapkan selama bertahun-tahun sekarang.
Anda mungkin ingin membaca makalah Microsoft:
... yang menguraikan pendekatan yang akan diambil Microsoft untuk mengatasi masalah kinerja fungsi skalar T-SQL dalam rilis setelah SQL Server 2017.
(penekanan milikku)
Fungsi T-SQL skalar sebaris sekarang diimplementasikan dalam SQL Server 2019 .
sumber
Seperti yang telah disebutkan Paul dengan tepat dalam jawabannya, tidak ada alasan mendasar mengapa skalar UDF tidak dapat dieksekusi menggunakan paralelisme. Namun, terlepas dari tantangan implementasi, ada alasan lain untuk memaksa mereka menjadi serial. The Froid kertas dikutip oleh Paulus memberikan informasi lebih lanjut tentang ini.
Mengutip dari kertas (Bagian 2.3):
Pendekatan Froid, seperti yang dijelaskan dalam makalah, tidak hanya akan menghasilkan rencana paralel, tetapi juga menambahkan banyak manfaat lebih untuk pertanyaan dengan UDF. Intinya, ini merangkum permintaan Anda untuk eksekusi UDF paralel.
[Pengungkapan: Saya adalah rekan penulis makalah Froid]
sumber