Hayır , Microsoft'tan davranışı garanti eden hiçbir belge yoktur, bu nedenle garanti edilmez .
Ayrıca, Basit Konuşma makalesinin doğru olduğunu ve Birleştirme fiziksel operatörünün girdileri her zaman planda gösterilen sırada (doğru olması muhtemel) işlediğini varsayarak, SQL Server'ın her zaman aynı tutan planlar üreteceğini garanti etmeden sorgu metni ve sorgu planı arasındaki sipariş, biraz daha iyi durumda.
Bunu daha ayrıntılı bir şekilde araştırabiliriz. Sorgu iyileştirici, Birleştirme operatörü girişini yeniden sıralayabiliyorsa, sys.dm_exec_query_transformation_stats
bu optimizasyona karşılık gelen belgelenmemiş DMV'de satırlar olmalıdır .
SELECT * FROM sys.dm_exec_query_transformation_stats
WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
SQL Server 2012 Enterprise Edition'da bu 24 satır üretir. Sabitler ile ilgili dönüşümler için yanlış eşleşmeleri göz ardı ederek, Zincirleme Fiziksel İşleci UNIAtoCON
(Tümünü Birleştirme ile Birleştirme) ile ilgili bir dönüşüm vardır . Dolayısıyla, fiziksel operatör düzeyinde, bir birleştirme operatörü seçildikten sonra, türetildiği mantıksal Union All operatörünün sırasına göre işleneceği anlaşılmaktadır.
Aslında bu tam olarak doğru değil. Maliyete dayalı optimizasyon tamamlandıktan sonra girdileri fiziksel bir Zincirleme işlecine yeniden sıralayabilen optimizasyon sonrası yeniden yazma işlemleri mevcuttur. Bir örnek, Birleştirme bir satır hedefine tabi olduğunda ortaya çıkar (bu nedenle önce daha ucuz girdiden okumak önemli olabilir). Daha fazla bilgi için Paul White'ın UNION ALL
Optimizasyonu bölümüne bakınız.
Bu geç fiziksel yeniden yazma işlemi SQL Server 2008 R2'ye kadar ve bu işlev dahil olmak üzere işlevseldi, ancak bir gerileme artık SQL Server 2012 ve sonraki sürümlere uygulanmadığı anlamına geliyordu. Sorgu iyileştirici düzeltmeleri etkinleştirilmiş olarak SQL Server 2014 ve sonraki sürümleri (2012 değil) için bu yeniden yazmayı eski durumuna getiren bir düzeltme yayınlanmıştır (örn. İzleme bayrağı 4199).
Ama Mantıksal Birlik hakkında Tüm operatör ( UNIA
)? UNIAReorderInputs
Girdileri yeniden düzenleyebilen bir dönüşüm var . Ayrıca mantıklı bir Birlik Tümünü UNIAtoCON
ve UNIAtoMERGE
(Birleşecekleri Birlik Birliği) uygulamak için kullanılabilecek iki fiziksel işleç de vardır .
Bu nedenle, Sorgu iyileştirici görünür olabilir bir için girdi yeniden sıralama UNION ALL
; ancak, ortak bir dönüşüm gibi görünmüyor ( UNIAReorderInputs
kolayca erişebildiğim SQL Server'ların sıfır kullanımı . Optimizer kullanımını sağlayacak koşulları bilmiyoruz UNIAReorderInputs
; ancak bir plan kılavuzu veya kullanımı plan ipucu, yukarıda belirtilen satır hedefi fiziksel yeniden sıralanan girdiler kullanılarak oluşturulan bir planı zorlamak için kullanılır.
Motorun aynı anda birden fazla girişi işlemesinin bir yolu var mı?
Birleştirme fiziksel operatörü bir planın paralel bir bölümünde bulunabilir. Bazı zorluk ile, aşağıdaki sorguyu kullanarak paralel birleştirme ile bir plan üretmek mümkün:
SELECT userid, regdate FROM ( --Users table is around 3mil rows
SELECT userid, RegDate FROM users WHERE userid > 1000000
UNION
SELECT userid, RegDate FROM users WHERE userid < 1000000
UNION all
SELECT userid, RegDate FROM users WHERE userid < 2000000
) d ORDER BY RegDate OPTION (RECOMPILE)
Yani, en katı anlamda, fiziksel Birleştirme operatörü girdileri daima tutarlı bir şekilde işlemektedir (ilk önce birinci, alt saniye); ancak, optimizer fiziksel operatörü seçmeden önce girişlerin sırasını değiştirebilir veya Birleştirme yerine Bir Birleştirme birleşimi kullanabilir.