Saya memiliki perhitungan yang sama di kedua klausa SELECT dan GROUP BY. Apakah SQL server benar-benar melakukan perhitungan ini dua kali, atau cukup pintar hanya melakukannya sekali?
Jawaban sederhana adalah bahwa SQL Server tidak memberikan jaminan umum tentang kapan, dan berapa kali, ekspresi skalar akan dievaluasi pada waktu eksekusi.
Ada segala macam perilaku rumit (dan tidak berdokumen) dalam optimizer dan mesin eksekusi terkait penempatan, pelaksanaan, dan caching ekspresi skalar. Books Online tidak banyak bicara tentang ini, tetapi yang dikatakannya adalah ini:
Ini menggambarkan salah satu perilaku yang saya singgung sebelumnya, menunda eksekusi ekspresi. Saya menulis tentang beberapa perilaku terkini lainnya (yang dapat berubah sewaktu-waktu) di posting blog ini .
Pertimbangan lain adalah bahwa model biaya yang digunakan oleh pengoptimal kueri saat ini tidak berbuat banyak dalam hal estimasi biaya untuk ekspresi skalar. Tanpa kerangka biaya yang kuat, hasil saat ini didasarkan pada heuristik yang luas atau peluang murni.
Untuk ekspresi yang sangat sederhana, mungkin tidak banyak bedanya apakah ekspresi tersebut dievaluasi satu atau beberapa kali dalam banyak kasus. Yang mengatakan, saya telah menemukan pertanyaan besar di mana kinerja telah berdampak buruk ketika ekspresi dievaluasi secara berlebihan sejumlah besar kali, atau evaluasi terjadi pada satu utas di mana akan menguntungkan untuk mengevaluasi dalam cabang paralel dari eksekusi rencana.
Singkatnya, perilaku saat ini tidak terdefinisi, dan tidak ada banyak rencana eksekusi untuk membantu Anda mengetahui apa yang terjadi (dan itu tidak selalu nyaman untuk melampirkan debugger untuk memeriksa perilaku mesin yang terperinci, seperti dalam posting blog).
Jika Anda menjumpai kasus-kasus di mana masalah evaluasi skalar berpengaruh terhadap kinerja, sampaikan masalah dengan Dukungan Microsoft. Ini adalah cara terbaik untuk memberikan umpan balik untuk meningkatkan versi produk di masa depan.
cross apply
dalam kasus ini adalah sedikit peregangan, dan itu akan sangat mungkin merusak kinerja dengan memperkenalkan self-join yang tidak perlu.CROSS APPLY
hanya mendefinisikan alias dari kolom dalam baris yang sama. Tidak perlu bergabung. mis.SELECT COUNT(*), hilo FROM master..spt_values CROSS APPLY (VALUES(high + low)) V(hilo) GROUP BY hilo
Kinerja hanyalah satu aspek. Yang lainnya adalah rawatan.
Secara pribadi, saya cenderung melakukan hal berikut:
MEMPERBARUI:
Jika Anda tidak suka bersarang, Anda bisa membuat LIHAT untuk setiap tabel tempat Anda perlu menggunakan ekspresi kompleks.
Kemudian Anda bisa memilih tanpa melakukan ekstra bersarang;
sumber