SQL Server ekibi üzerinde çalışıyorum ve umarım bu konudaki birkaç noktayı açıklığa kavuşturabilirim (daha önce görmemiştim, bu yüzden mühendislik ekibinin daha önce yapmadığı için üzgünüm).
İlk olarak, select count(1) from table
vs. arasında anlamsal bir fark yoktur select count(*) from table
. Her durumda aynı sonuçları döndürürler (ve değilse bir hatadır). Diğer cevaplarda belirtildiği gibi select count(column) from table
, anlamsal olarak farklıdır ve her zaman aynı sonuçları döndürmez count(*)
.
İkincisi, performans açısından SQL Server'da (ve SQL Azure'da) önemli olan iki unsur vardır: derleme zamanı çalışması ve yürütme zamanı çalışması. Derleme zamanı işi, mevcut uygulamada çok az miktarda ekstra çalışmadır. Bazı durumlarda * 'ın tüm sütunlara genişlemesi, ardından bazı dahili işlemlerin bağlanma ve optimizasyonda nasıl çalıştığından dolayı çıkacak 1 sütuna kadar bir azalma olur. Ölçülebilir bir testte görüneceğinden ve muhtemelen kapakların altında gerçekleşen diğer tüm şeylerin (otomatik istatistikler, xevent oturumları, sorgu deposu yükü, tetikleyiciler vb.) Gürültüsünde kaybolacağından şüpheliyim. Belki birkaç bin ekstra CPU talimatıdır. Yani, count (1) derleme sırasında biraz daha az iş yapar (genellikle bir kez olur ve plan birden fazla yürütmede önbelleğe alınır). Yürütme süresi için planların aynı olduğu varsayılarak ölçülebilir bir fark olmamalıdır. (Önceki örneklerden biri bir fark gösterir - büyük olasılıkla, plan aynıysa makinedeki diğer faktörlerden kaynaklanır).
Planın potansiyel olarak nasıl farklı olabileceğine gelince. Bunların olması pek olası değildir, ancak mevcut optimize edicinin mimarisinde potansiyel olarak mümkündür. SQL Server'ın optimizer bir arama programı olarak çalışır (düşünün: sorgunun farklı bölümleri için çeşitli alternatifler aracılığıyla satranç oynayan ve makul zamanda en ucuz planı bulmak için alternatifleri maliyetlendiren bilgisayar programı). Bu aramanın, sorgu derleme işlemini makul sürede bitirmesini sağlamak için nasıl çalıştığı konusunda birkaç sınırı vardır. En önemsiz sorgular için, aramanın aşamaları vardır ve bunlar, optimize edicinin sorgunun potansiyel olarak yürütmek için ne kadar pahalı olduğunu düşündüğüne göre sorgu yığınlarıyla ilgilenir. 3 ana arama aşaması vardır ve her aşama önceki çözümlerden daha ucuz bir plan bulmaya çalışırken daha agresif (pahalı) sezgisel tarama yapabilir. Sonuçta, her aşamanın sonunda, şimdiye kadar bulduğu planı geri getirip getirmeyeceğini veya aramaya devam edip etmeyeceğini belirlemeye çalışan bir karar süreci vardır. Bu süreç şimdiye kadar alınan toplam süreyi ve şimdiye kadar bulunan en iyi planın tahmini maliyetini kullanmaktadır. Bu nedenle, farklı CPU hızlarına sahip farklı makinelerde, daha önceki bir aşamada bir planla bir sonraki arama aşamasına devam etmek yerine zaman aşımı nedeniyle farklı planlar elde etmek mümkündür (nadir de olsa). Ayrıca, son aşamadan zamanlama ve makinedeki tüm belleği tüketen çok, çok pahalı sorgularda belleğin tükenmesi ile ilgili birkaç benzer senaryo vardır (genellikle 64 bitlik bir sorun değildir, ancak daha büyük bir endişeydi) 32 bit sunuculara geri dön). Sonuçta, farklı bir plan alırsanız çalışma zamanındaki performans farklı olacaktır. Yapmıyorum
Net-net: Lütfen hiçbiri önemli olmayan herhangi bir pratik formda kullanmak istediğiniz ikisinden hangisini kullanın. (Dürüst olmak gerekirse, SQL'deki performansı bu konunun ötesinde etkileyen çok daha büyük faktörler vardır).
Umarım bu yardımcı olur. Optimize edicinin nasıl çalıştığı hakkında bir kitap bölümü yazdım, ancak buraya göndermenin uygun olup olmadığını bilmiyorum (ondan hala küçük telifler aldığım için inanıyorum). Yani, İngiltere'de SQLBits'de optimize edicinin nasıl yüksek düzeyde çalıştığı hakkında verdiğim bir konuşmaya bir bağlantı yayınlayacağımı yayınlamak yerine, isterseniz aramanın farklı ana aşamalarını biraz daha ayrıntılı olarak görebilirsiniz bunu öğrenmek için. İşte video bağlantısı: https://sqlbits.com/Sessions/Event6/inside_the_sql_server_query_optimizer