SQL Server 2012'de (veya 2005'ten sonraki herhangi bir sürümde), SELECT *...
bir sorgunun en üst düzey SELECT ifadesinde yalnızca olası bir performans sorunudur.
O CTEs var maddelerinde alt sorgular içinde Görünümler (*),, sorunun değil, ne Yani SELECT COUNT(*)..
vs vs Not, bu Oracle için de muhtemelen doğrudur ve DB2 ve belki PostgreS (değil emin) Ancak, birçok durumda hala MySql için bir sorun olması muhtemeldir.
Nedenini (ve neden hala üst düzey bir SEÇİM'de bir sorun olabileceğini) anlamak için, bunun neden bir sorun olduğunu anlamakta fayda var, bunun nedeni SELECT *..
" sütunların TÜMÜNÜ döndür " anlamına gelmesidir . Genel olarak bu, gerçekten istediğinizden çok daha fazla veri döndürecektir ; bu, hem disk hem de ağ üzerinde çok daha fazla GÇ'ye neden olabilir.
Daha az belirgin olan şey, bunun bir SQL optimizer'ın kullanabileceği endeksleri ve sorgu planlarını da sınırlandırmasıdır, çünkü sonuçta tüm veri sütunlarını döndürmesi gerektiğini bilir. Önceden yalnızca belirli sütunlar istediğinizi biliyorsa, yalnızca bu sütunları içeren dizinlerden yararlanarak daha verimli sorgu planları kullanabilir. Neyse ki, bunu önceden bilmenizin bir yolu var, bu da sütun listesinde istediğiniz sütunları açıkça belirtmeniz içindir. Ama "*" kullandığın zaman, bunu "bana her şeyi ver, ihtiyacım olanı çözeceğim" lehine bekliyorsun.
Evet, ayrıca her sütunu işlemek için ek CPU ve bellek kullanımı da vardır, ancak bu iki şeye kıyasla neredeyse her zaman küçüktür: İhtiyacınız olmayan sütunlar için gereken önemli ekstra disk ve ağ bant genişliği ve daha az kullanmanız gerekir Her sütunu içermesi gerektiği için optimize edilmiş sorgu planı.
Peki ne değişti? Temel olarak, SQL Optimizers başarılı bir şekilde "Sütun Optimizasyonu" adında bir özellik eklediler ki bu, sorgunun üst seviyelerinde bir sütun kullanacaksanız, şimdi alt seviye alt sorgularda çözebileceklerini şimdi anlayabiliyorlar.
Bunun bir sonucu olarak, bir sorgunun alt / iç seviyelerinde 'SELECT * ..' kullanmanız artık önemli değil. Bunun yerine, asıl önemli olan, üst düzey SELECT'in sütun listesinde bulunan şeydir. SELECT *..
En üstte kullanmıyorsanız , bir kez daha kullanın, sütunların TÜMÜNÜ istediğinizi varsayalım ve bu nedenle sütun optimizasyonlarını etkin bir şekilde kullanamazsınız.
(* - *
"*" kullanıldığında sütun listelerindeki değişikliği her zaman kaydetmedikleri Görünümlerde farklı, küçük bir ciltleme sorunu olduğunu unutmayın . Bunu ele almanın başka yolları da vardır ve performansı etkilemez.)