SQL, bildirimsel bir dildir, yordamsal bir dil değildir. Yani, istediğiniz sonuçları tanımlamak için bir SQL deyimi oluşturursunuz. SQL motoruna işin nasıl yapılacağını söylemiyorsunuz .
Genel bir kural olarak, SQL motorunun ve SQL optimizer'ın en iyi sorgu planını bulmasına izin vermek iyi bir fikirdir. Bir SQL motoru geliştirmek için yıllarca süren çabalar vardır, bu yüzden mühendislerin nasıl yapabileceklerini bildiklerini yapmasına izin verin.
Tabii ki, sorgu planının optimal olmadığı durumlar vardır. Daha sonra, daha iyi performans elde etmek için sorgu ipuçlarını kullanmak, sorguyu yeniden yapılandırmak, istatistikleri güncellemek, geçici tablolar kullanmak, dizinler eklemek vb.
Sorunuza gelince. CTE'lerin ve alt sorguların performansı teorik olarak aynı olmalıdır çünkü her ikisi de sorgu optimize ediciye aynı bilgileri sağlar. Bir fark, bir kereden fazla kullanılan bir CTE'nin bir kez kolayca tanımlanıp hesaplanabilmesidir. Daha sonra sonuçlar depolanabilir ve birden çok kez okunabilir. Ne yazık ki, SQL Server bu temel optimizasyon yönteminden yararlanmak gibi görünmüyor (bu ortak alt sorgu ortadan kaldırması diyebilirsiniz).
Geçici tablolar farklı bir konudur, çünkü sorgunun nasıl çalıştırılacağı konusunda daha fazla rehberlik sağlarsınız. Önemli bir fark, optimize edicinin sorgu planını oluşturmak için geçici tablodaki istatistikleri kullanabilmesidir. Bu performans artışlarına neden olabilir. Ayrıca, bir kereden fazla kullanılan karmaşık bir CTE'niz (alt sorgu) varsa, bunu geçici bir tabloda saklamak genellikle performans artışı sağlar. Sorgu yalnızca bir kez yürütülür.
Sorunuzun yanıtı, özellikle düzenli olarak yürütülen karmaşık sorgular için beklediğiniz performansı elde etmek için oynamanız gerektiğidir. İdeal bir dünyada, sorgu optimize edici mükemmel yürütme yolunu bulur. Sık sık yapsa da, daha iyi performans elde etmenin bir yolunu bulabilirsiniz.