SORU
3 EYLÜL 2010, Cuma


Neden SELECT * zararlı olarak kabul edilir?

Neden SELECT * kötü bir uygulamadır? Daha az kod eğer yeni bir sütun eklendi eğer değiştirmek demek istedin değil mi?

SELECT COUNT(*) bazı DBs performans bir sorun olduğunu, ama eğer sen gerçekten her sütun isteseydi ne anlıyorum?

CEVAP
3 EYLÜL 2010, Cuma


Üç ana nedeni vardır:

  • Tüketici için veri taşıma verimsizlik.Seçtiğinizde, sık sık uygulama gerçekten çalışması için gerekenden veritabanından daha fazla sütun alınıyor. Bu daha fazla veri istemciye sunucudan veritabanı taşımak için, erişim yavaşlaması ve makineler üzerindeki yükü artan, aynı zamanda daha fazla zaman ağ üzerinden seyahat için almaya neden olur. Bu kimse yoktu alttaki tablo için yeni bir sütun ekler ve orijinal tüketiciler kendi veri erişim kodlu gerektiğinde değilken, özellikle doğrudur.

  • Dizin oluşturma sorunları.Performans yüksek düzeyde bir sorgu yapmak istediğiniz bir senaryo düşünün. Eğer gerçekten gerekli olandan daha fazla sütun döndü * ve kullanmak olsaydı, sunucu sık sık aksi olabilir daha pahalı yöntemler verilerinizi kurtarmak için yapmak zorunda. Sadece SEÇİN listesinde sütunları kapsayan bir dizin oluşturmak mümkün olmaz, ve eğer olsaydı bile, örneğin, (tüm sütunlar da dahil olmak üzere [ürperti]), yanındaki adam kim uğradı ve ilave bir sütun temel tablo olmasına neden olacak iyileştirici görmezden senin optimize kapsayan Endeksi, büyük olasılıkla bulmak da performans sorgulaması önemli ölçüde düşüş için hazır görünür.

  • Bağlama Sorunları.Seçtiğinizde *, mümkün iki farklı tablodan aynı adı taşıyan iki sütun almak için. Bu genellikle veri tüketici kalabilir. Bir sütun adı içeren iki tablo, birleştiren bir sorgu hayal"". ID Nasıl bir tüketici olan hangisi? SELECT * ayrıca alttaki tablo yapıları -- the view is not rebuilt, and the data which comes back can be nonsense değişim ne zaman manzaraları (en azından bazı sürümleri SQL) karıştırmayın. Ve en kötü kısmı da o tedavi EDEBİLİR MİSİN adınızı sütunlar nasıl isterseniz, ama yanındaki adam kim gelir diye yok bunu bilmenin bir yolu var endişelenecek ekleyerek bir sütun olacak çarpışır ile zaten gelişmiş bir isim.

Ama SELECT * kötü bir şey değil ki. Bolca bu durumlarda kullanmak için kullanıyorum:

  • Ad-hoc sorgular.Bir şey hata ayıklama çalışılırken, özellikle aşina olmayabilir dar bir masadan SEÇİN * sık sık en iyi arkadaşım. Bana sadece temel sütun adları ne gibi araştırma bir sürü yapmak zorunda kalmadan neler olduğunu görmenize yardımcı olur. Bu daha büyük olacak "artı" uzun sütun adları.

  • * Anlamı, "bir satır".Kullanım aşağıdaki durumlarda, SELECT * gayet güzel ve performanslı bir katil olduğunu söylentiler yıllar önce bazı geçerlilik olmuş olabilir, ama artık yok: sadece şehir efsaneleri vardır

    SELECT COUNT(*) FROM table;
    

    bu durumda, * anlamı "satır sayısı". * Eğer , . bir sütun adı yerine kullanmak olsaydı ^em>o sütunun değeri null olmayan satırların sayısı. COUNT(*), benim için, gerçekten eve sayıyorsunuz bu kavramı kullanıyorsatırsize garip kenar durumlarda Boşluk senin toplayan elimine olmasının getirdiği önlemek , ve.

    Aynı bu tür Sorgu ile gider:

    SELECT a.ID FROM TableA a
    WHERE EXISTS (
        SELECT *
        FROM TableB b
        WHERE b.ID = a.B_ID);
    

    herhangi bir veri tabanı tuz, * değer anlamı "satır". Alt sorgu koyduğun önemli değil. Bazı insanlar seçim listesinde b KİMLİK kullanmak, ya da bu kuralları çok saçma 1 numara kullanacaklar. Yani ne "satır sayısı", ve o * anlamına gelir. En bu sorgu bilecek kadar akıllı var optimize. Dürüst olmak gerekirse (gerçi sadecebiliyorumbu SQL Server ile doğru ve Oracle.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Autodesk 3ds Max Learning Channel

    Autodesk 3ds

    23 HAZİRAN 2010
  • Harvest: Greg Laurie

    Harvest: Gre

    6 HAZİRAN 2006
  • YEAH1TV

    YEAH1TV

    19 ŞUBAT 2009