Sonucu tam olarak 3 farklı kılavuzla ortaya çıkarmanın HERHANGİ bir yolu var mı? Bazı SQL Server CTE tuhaflıkları aşmak için birden çok kez başvurulan CTE türü sorguları ile plan kılavuzları ekleyerek gelecekte soruları daha iyi cevap verebilmeyi umuyorum.
Bugün değil. Özyinelemesiz ortak tablo ifadeleri (CTE'ler) satır içi görünüm tanımları olarak ele alınır ve optimizasyondan önce referans verildikleri her yerde (normal görünüm tanımları gibi) mantıksal sorgu ağacına genişletilir. Sorgunuz için mantıksal ağaç:
LogOp_OrderByCOL: Union1007 ASC COL: Union1015 ASC
LogOp_Project COL: Union1006 COL: Union1007 COL: Union1014 COL: Union1015
LogOp_Join
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
Optimizasyon başlamadan önce iki Görünüm Bağlantısına ve iç fonksiyona yapılan altı çağrıya dikkat edin newid
. Bununla birlikte, birçok kişi, optimize edicinin genişletilmiş alt ağaçların başlangıçta tek bir referans nesne olduğunu belirleyebileceğini ve buna göre basitleştirebileceğini düşünmektedir. Bir CTE'nin veya türetilmiş tablonun açık bir şekilde gerçekleştirilmesine izin vermek için birkaç Connect isteği de vardır .
Daha genel bir uygulama, optimize edicinin performansı artırmak için keyfi ortak ifadeleri gerçekleştirmeyi düşünmesini sağlayacaktır ( CASE
bir alt sorgu ile sorunların bugün ortaya çıkabileceği başka bir örnektir ). Microsoft Research , 2007'de bu konuda bir makale (PDF) yayınladı, ancak bugüne kadar uygulanmadı. Şimdilik, tablo değişkenleri ve geçici tablolar gibi açık materyalizasyonla sınırlıyız.
SQLKiwi, SSIS planlarını belirtti, SQL Server için iyi bir plan düzenlemeye yardımcı olmak için bir yol veya yararlı bir araç var mı?
Bu sadece benim tarafımdan düşünmekti ve plan kılavuzlarını değiştirme fikrinin ötesine geçti. Prensip olarak, şov planı XML'sini doğrudan manipüle etmek için bir araç yazmak mümkündür, ancak aracı kullanmak için belirli bir optimize edici enstrüman olmadan kullanıcı için sinir bozucu bir deneyim olacaktır (ve geliştirici bunu düşünmeye gelir).
Bu sorunun özel bağlamında, böyle bir araç hala CTE içeriğini birden fazla tüketici tarafından kullanılabilecek şekilde gerçekleştiremez (bu durumda her iki girişi de çapraz birleştirmeye beslemek için). Optimize edici ve yürütme motoru, çok tüketici makaralarını destekler, ancak yalnızca belirli amaçlar için - bunların hiçbiri bu özel örneğe uygulanamaz.
Emin olmasam da, sorgu planla tam olarak aynı olmasa bile RelOps'un (İç İçe Döngü, Tembel Makara) izlenebileceği oldukça güçlü bir önsezim var - örneğin CTE'ye 4 ve 5 eklediyseniz , hala aynı planı kullanmaya devam ediyor (görünüşte - SQL Server 2012 RTM Express'te test edildi).
Burada makul bir esneklik var. XML planının geniş şekli, son bir planın aranmasına rehberlik etmek için kullanılır (ancak birçok özellik tamamen yok sayılır, örneğin borsalarda bölümleme türü) ve normal arama kuralları da oldukça rahatlar. Örneğin, maliyet değerlendirmelerine dayalı alternatiflerin erken budanması devre dışı bırakılır, çapraz eklemelerin açık bir şekilde girilmesine izin verilir ve skaler işlemler göz ardı edilir.
Orada derinlemesine girmek çok fazla ayrıntı vardır, ama Filtreler ve Compute Skalarların yerleştirme zorla edilemez ve formun yüklemler column = value
bir plan içeren böylece genelleştirilir X = 1
veya X = @X
içeren bir sorguya uygulanabilir X = 502
ya X = @Y
. Bu özel esneklik, zorlamak için doğal bir plan bulmada büyük ölçüde yardımcı olabilir.
Özel örnekte, sürekli Birlik Hepsi her zaman Sabit Tarama olarak uygulanabilir; Birliğe girişlerin sayısı önemli değildir.