Hangisi daha hızlı / en iyisi? SELECT * veya SELECT sütun1, sütun2, sütun3 vb.


166

Özellikle ihtiyacınız SELECT *olan SELECTsütunlar için daha verimli olduğu için SQL komutları yazarken genellikle kötü bir uygulama olduğunu duydum .

SELECTBir tablodaki her sütuna ihtiyacım varsa kullanmalıyım

SELECT * FROM TABLE

veya

SELECT column1, colum2, column3, etc. FROM TABLE

Bu durumda verimlilik gerçekten önemli mi? SELECT *Tüm verilere gerçekten ihtiyacınız varsa dahili olarak daha uygun olacağını düşünürdüm , ancak bunu gerçek bir veritabanı anlayışı olmadan söylüyorum.

Bu durumda en iyi uygulamanın ne olduğunu merak ediyorum.

GÜNCELLEME: Muhtemelen gerçekten yapmak istediğim tek durumun SELECT *, yeni sütunlar eklendiğinde bile, tüm sütunların her zaman alınması gerektiğini bildiğim bir tablodan veri seçtiğimi belirtmeliyim.

Ancak gördüğüm yanıtlar göz önüne alındığında, bu hala kötü bir fikir gibi görünüyor ve SELECT *asla düşündüğüm çok daha teknik nedenlerle kullanılmamalıdır.




1
Evet, bunların çoğunun kopyası.
George Stocker

Yanıtlar:


168

Belirli sütunları seçmenin daha iyi bir nedeni, SQL Server'ın tablo verilerini sorgulamak yerine dizinlerden verilere erişme olasılığını arttırmasıdır.

İşte bunun hakkında yazdığım bir yazı: Seçme sorgularının gerçek nedeni kötü dizin kapsamı

Ayrıca, verileri tüketen herhangi bir kod, gelecekte tablo şemasında yapacağınız değişikliklerden bağımsız olarak aynı veri yapısına sahip olacağından, değiştirmek daha az kırılgandır.


3
Bunun için +1. Başvurulan tüm sütunlar tek bir dizinde ("kaplama dizini") varsa, altın vurursunuz.
Ian Nelson

22
bu onun sorusunun cevabı değil - "Bir tablodaki her sütunu SEÇMEM gerekiyorsa, ..." - bu durumda, * vs col1, .., coln önemli değil (ama programcı zamanı için, çünkü * daha kısadır!).
Matt Rogish

3
Seçme listesi, özellikle SQL saklı bir yordamda ise, bir tür bir sözleşme biçimi olduğu için hala önemlidir.
Eric Z Beard

4
Jon'un söyledikleri tamamen doğru ve çok geçerli bir nokta olsa da, ASKED sorusunun zaten tüm sütunlar için sorulup sorulmadığıyla ilgili olduğu konusunda hemfikirim. Sorunun bu kısmı nedeniyle, gerçek konular şema değişiklikleri karşısında kırılganlıktır.
ıdisposable

1
@MattRogish efendim doğru vsanladınız, binlerce satır varken bu iki yöntem (* all_column_names) arasında herhangi bir performans farkı var mı?
santosh

59

Verilen senin o spesifikasyonu olan tüm sütunları seçerek, küçük bir fark vardır şu anda . Ancak, veritabanı şemalarının değiştiğini anlayın. Eğer kullanırsanız SELECT *bile olasılıkla olsa tabloya eklenir herhangi bir yeni sütunlar almak için gidiyoruz, kodunuz yeni veriler bu kullanıma veya günümüze kadar hazır değil. Bu, sisteminizi beklenmedik performans ve işlevsellik değişikliklerine maruz bıraktığınız anlamına gelir.

Bunu küçük bir maliyet olarak reddetmeye istekli olabilirsiniz, ancak ihtiyacınız olmayan sütunların yine de olması gerektiğini unutmayın:

  1. Veritabanından okuma
  2. Ağ üzerinden gönderildi
  3. İşleminize uygun
  4. (ADO tipi teknolojiler için) Veri tablosundaki bellekte kaydedildi
  5. Yok sayıldı ve atıldı / çöp toplandı

Öğe # 1, bazı potansiyel kaplama dizinini ortadan kaldırmak, veri sayfası yüklerine (ve sunucu önbellek bozulmasına neden olmak), aksi takdirde önlenebilecek satır / sayfa / tablo kilitlerine neden olmak gibi birçok gizli maliyete sahiptir.

Bunu, sütunları *bire karşı belirlemenin potansiyel tasarruflarına karşı dengeleyin ve tek potansiyel tasarruf:

  1. Programcının sütun eklemek için SQL'i tekrar ziyaret etmesi gerekmez
  2. SQL'in ağ aktarımı daha küçük / daha hızlı
  3. SQL Server sorgu ayrıştırma / doğrulama süresi
  4. SQL Server sorgu planı önbelleği

1. madde için gerçek şu ki, ekleyebileceğiniz herhangi bir yeni sütunu kullanmak için kod ekleyeceksiniz / değiştireceksiniz, bu yüzden bir yıkama.

Öğe 2 için, fark sizi farklı bir paket boyutuna veya ağ paketlerinin sayısına itmek için nadiren yeterlidir. SQL deyimi iletim zamanının baskın olduğu noktaya gelirseniz, muhtemelen önce ifade oranını azaltmanız gerekir.

3. madde için *, zaten genişlemenin gerçekleşmesi gerektiği için tasarruf YOKTUR , bu da yine de tablo (lar) şemasına danışmak anlamına gelir. Gerçekçi olarak, sütunları listelemek aynı şemaya neden olacaktır, çünkü şemaya göre doğrulanması gerekir. Başka bir deyişle, bu tam bir yıkamadır.

4. madde için, belirli sütunları belirttiğinizde, sorgu planı önbelleğiniz daha büyük olabilir, ancak yalnızca farklı sütun kümeleriyle (belirttiğiniz şekilde değil) ilgileniyorsanız. Bu durumda, gerektiğinde farklı planlar istediğiniz için farklı önbellek girdileri istersiniz.

Bu nedenle, soruyu belirtme şekliniz nedeniyle, sonuçta ortaya çıkan şema değişiklikleri karşısında sorunun esnekliğine tüm bunlar iner. Bu şemayı ROM'a yazıyorsanız (olur), o zaman bir *mükemmel kabul edilebilir.

Bununla birlikte, genel yönergem, yalnızca ihtiyacınız olan sütunları seçmeniz gerektiğidir, bu da bazen hepsini istiyormuşsunuz gibi görünecektir, ancak DBA'lar ve şema gelişimi, sorguyu büyük ölçüde etkileyebilecek bazı yeni sütunların görünebileceği anlamına gelir .

Benim tavsiyem, HER ZAMAN belirli sütunları SEÇMenizdir . Tekrar tekrar yaptığınız işte iyi olduğunuzu unutmayın, bu yüzden doğru yapma alışkanlığına sahip olun.

Bir şemanın kod değiştirmeden neden değişebileceğini merak ediyorsanız, denetim günlüğü, geçerlilik / son kullanma tarihleri ​​ve uyumluluk sorunları için DBA'lar tarafından sistematik olarak eklenen diğer benzer şeyleri düşünün. Elde edilen değişikliklerin bir başka kaynağı, sistemdeki veya kullanıcı tanımlı alanlardaki başka bir yerde performans için denormalizasyonlardır.


3
"Gerçek şu ki, ekleyebileceğiniz herhangi bir yeni sütunu kullanmak için kod ekleyeceksiniz / değiştireceksiniz, bu yüzden bir yıkama." -Sadece kodunuzdaki her sütunu manuel olarak okuyorsanız. Otomatik eşleme kullanıyorsanız, durum böyle değildir ve bu sorun önemli hale gelmektedir.
Josh Noe

36

Yalnızca ihtiyacınız olan sütunları seçmelisiniz. Tüm sütunlara ihtiyacınız olsa bile, sql sunucusunun sütunlar için sistem tablosunu sorgulaması gerekmemesi için sütun adlarını listelemek daha iyidir.

Ayrıca, biri tabloya sütun eklerse uygulamanız bozulabilir. Programınız beklemediği sütunları alacak ve bunları nasıl işleyeceğini bilemeyebilir.

Bunun dışında tablonun bir ikili sütunu varsa, sorgu çok daha yavaş olacaktır ve daha fazla ağ kaynağı kullanacaktır.


6
Aa * kullanarak DB için ekstra iş ekliyorsunuz. Tamam, düşünmememin bir nedeni bu.
Ankur

1
Hataları erken kırma / yakalama riskleri için +1. Verimlilik tartışmasının geçerli olduğunu düşünüyorum ama YAGNI.
nailitdown

6
SQL sunucusunun "col1" belirtilen tabloda zaten olup olmadığını, yani sorgu sistemi tablosunu doğrulaması veya kontrol etmesi gerekmez mi?
Patrick

3
En büyük performans isabeti muhtemelen endeksleme ile ilgilidir. Aradığınız sütun, sunucunun verileri oraya getireceği verileri bulmak için kullanılan dizinin bir parçasıysa, bir seçim yaparsanız * büyük olasılıkla, yer işareti araması denen şeyi yapmak zorunda kalacak ve bu da ekstra bir ihtiyaç duymayabileceğiniz temel verileri bulmak için tarayın.
Cobusve

3
@Patrick - Spot on. Önlemek için birçok iyi neden * ama bu onlardan biri değil.
Martin Smith

31

select *Kötü bir şey olmasının dört büyük nedeni vardır :

  1. En önemli pratik neden, kullanıcıyı sütunların döndürülme sırasını sihirli bir şekilde bilmeye zorlamasıdır. Açık olmak daha iyidir, bu da sizi masa değişimlerine karşı korur, bu da güzelce ...

  2. Kullandığınız bir sütun adı değişirse, artık var olmayan (veya adını değiştirmiş vb.) Sütunu kullanmaya çalışmanız yerine onu (SQL çağrısının yapıldığı noktada) erken yakalamak daha iyidir. )

  3. Sütun adlarını listelemek, kodunuzu daha kendi kendine belgelendirir ve muhtemelen daha okunabilir hale getirir.

  4. Bir ağ üzerinden aktarıyorsanız (veya olmasanız bile), ihtiyacınız olmayan sütunlar sadece israftır.


7
"En önemli pratik neden, kullanıcıyı sütunların döndürülme sırasını sihirli bir şekilde bilmeye zorlamasıdır." Bunun nasıl bir sorun olduğunu anlamıyorum. Herhangi bir modern DB istemcisinde, sütunları sıra yerine isme göre okursunuz.
Josh Noe

Ben bir C arayüzü üzerinden SQL çalıştırmak eğilimindedir, bu yüzden gerçekten "DB istemcileri" sanat durumunu bilmiyordum. Ama muhtemelen bahsettiğin türden bir istemci standart olmayan SQL dışı bir sihir yapıyor. (örneğin, *
SQLite'de

Ve bundan da öte, kaç kişi sütun adlarının dizinini kullanan modern uygulamalarda kod yazar? Çoğu insan, bir tür haritacı ve bayatlamaya izin verilen veriler için bir sürü önbellek yığını kullanıyor. Şahsen, önce kodu yazın ve daha sonra performans sorunlarınız varsa endişelenin.
Colin Wiseman

10

Sütun listesinin belirtilmesi genellikle en iyi seçenektir, çünkü birisi tabloya sütun ekler / eklerse uygulamanız etkilenmez.


7

Sunucu için sütun adlarını belirtmek kesinlikle daha hızlıdır. Ama eğer

  1. performans büyük bir sorun değildir (örneğin, bu, her tabloda yüzlerce, belki binlerce - ancak milyonlarca değil) bir web sitesi içerik veritabanıdır; VE
  2. işiniz, karmaşık bir kerelik uygulama oluşturmak yerine, ortak bir çerçeve kullanarak birçok küçük, benzer uygulama (örneğin, halka açık içerikle yönetilen web siteleri) oluşturmaktır; VE
  3. esneklik önemlidir (her site için db şemanın özelleştirme sürü);

SELECT * ile yapışmadan daha iyi olursunuz. Çerçevemizde SELECT * 'in yoğun kullanımı, bir tabloya yeni bir web sitesi tarafından yönetilen içerik alanı sunmamıza izin vererek, CMS'nin tüm avantajlarını (sürüm oluşturma, iş akışı / onaylar, vb.) Verirken, yalnızca birkaç nokta yerine, birkaç düzine puan.

DB guruları bunun için benden nefret edeceklerini biliyorum - devam et, bana oy ver - ama dünyamda geliştirici zamanı az ve CPU döngüleri çok fazla, bu yüzden neyi koruduğumu ve neyi harcadığımı ayarlıyorum.


1
Ayrıca ORM'lerin kullanımını çok daha basit hale getirir. Sorgular bir sorgu oluşturma nesnesinin etrafından geçirilerek oluşturulduğunda, kodun diğer bölümleri için hangi sütunların gerekli olduğunun farkında olması gerekmez (izin denetimleri, neyin var). Bu nedenle sütunları sınırlamak için, bir sorgunun her yazılması gerektiğinde araştırılması gerekir. Bu anlamsız, IMO. Sorguların yavaş olduğu (günlükler!) Olduğunda, bunlar geliştirilebilir.
bytepusher

6

SELECT *, sorgu bir ağ üzerinden gönderilmese bile kötü bir uygulamadır.

  1. İhtiyacınız olandan daha fazla veri seçmek sorguyu daha az verimli hale getirir - sunucunun fazladan veri okuması ve aktarması gerekir, bu nedenle zaman alır ve sistemde gereksiz yük oluşturur (sadece diğer ağlarda değil, aynı zamanda disk, CPU vb. ). Ayrıca, sunucu sorguyu olabildiğince optimize edemez (örneğin, sorgu için kaplama dizini kullanabilir).
  2. Bir süre sonra tablo yapınız değişebilir, bu nedenle SELECT * farklı bir sütun kümesi döndürür. Bu nedenle, uygulamanız beklenmedik bir yapı veri kümesi alabilir ve aşağı yönde bir yerde kırılabilir. Sütunları açıkça belirtmek, bilinen yapının bir veri kümesini almanızı veya veritabanı düzeyinde net bir hata almanızı sağlar ('sütun bulunamadı' gibi).

Tabii ki, tüm bunlar küçük ve basit bir sistem için çok önemli değil.


4

Performans açısından, belirli sütunlarla SELECT daha hızlı olabilir (tüm verilerin okunmasına gerek yoktur). Sorgunuz gerçekten TÜM sütunları kullanıyorsa, yine de açık parametrelerle SELECT tercih edilir. Herhangi bir hız farkı temelde fark edilmeyecek ve sabit zamana yakın olacaktır. Bir gün şemanız değişecek ve bu, bundan kaynaklanan sorunları önlemek için iyi bir sigortadır.


Birkaç DB ile yaptığım çeklerden fark edilmeden yanılıyorsunuz, her bir sütunun seçilmesinin, hepsinin bile çok daha hızlı olduğu açıktı. Bazı durumlarda üç kat daha hızlıydı.
shahar eldad

4

Burada şimdiye kadar cevaplanmış birçok iyi neden var, burada bahsedilmeyen başka bir neden var.

Sütunları açıkça adlandırmak, yolda bakım konusunda size yardımcı olacaktır. Bir noktada değişiklikler yapacak veya sorun giderme yapacaksınız ve kendinizi "bu sütunun nerede kullanıldığı sorusunu" bulacaksınız.

Adları açıkça listelediyseniz, bu sütuna yapılan tüm başvuruları (depolanmış tüm yordamlarınız, görünümleriniz vb.) Bulmak kolaydır. DB şemanız için bir CREATE betiği ve metin araması yapın.


3

sütunları kesinlikle tanımlayın, çünkü SQL Server sütunları çekmek için bir arama yapmak zorunda kalmayacaktır. Sütunları tanımlarsanız, SQL bu adımı atlayabilir.


Bu: 1) ilgisizdir, çünkü SQL Server tablo şemasına her iki şekilde de başvurmak zorundadır (sütun adlarını doğrulamak veya bilinen geçerli sütun adlarını aramak için) 2) Tüm sütunlara başvuruda bulunulan soru ile ilgili değildir. SORULAN tek sorun şema değişiklikleri ile kırılganlıktır.
ıdisposable

Aşağı düştü, çünkü ne olursa olsun sütunları doğrulaması gerekiyor.
John Gibb

3

İhtiyacınız olan sütunları belirtmek her zaman daha iyidir, eğer bir kez düşünürseniz, SQL'in her sorguda "wtf * olduğunu" düşünmesi gerekmez. Bunun da ötesinde, daha sonra birisi sorgunuzda gerçekten ihtiyaç duymadığınız tablolara sütunlar ekleyebilir ve bu durumda tüm sütunlarınızı belirterek daha iyi durumda olursunuz.


1
Bu doğru değil: SQL sunucusu yine de her sütunu ayrıştırmalı ve kataloglarda var olup olmadığına bakmalı, oysa "*" işaretinin (ve evet, * tüm sütunlara genişletildiğini) biliyor . Her iki durumda da, DBMS'nin birini (24.000 sütununuz yoksa) her ikisini de yapması son derece kolaydır, bu yüzden her iki şekilde de aynı şekilde bahse girerim
Matt Rogish 15:08

Birçoğunun eksik olması daha iyi bir nokta ve ne yazık ki, bu cevap sadece ikincil olarak ele alıyor, şema / tablo değişiklikleri gerçekleşirse (yani yeni sütunlar eklenirse) bir şeyleri kırmayacağını düşünüyorum.
Sean Hanley

1
* Genişletme için sütunlara bakmak, sağlanan sütun adlarını doğrulamakla aynı olduğundan tam bir yıkamadır.
ıdisposable

3

"Select *" ile ilgili sorun, gerçekten ihtiyacınız olmayan verileri getirme olasılığıdır. Gerçek veritabanı sorgusu sırasında, seçilen sütunlar hesaplamaya gerçekten eklemez. Gerçekten "ağır" olan şey, müşterinize geri veri aktarımıdır ve gerçekten ihtiyacınız olmayan herhangi bir sütun sadece ağ bant genişliğini boşa harcar ve sorgunun geri dönmesini beklediğiniz süreye eklemektir.

"Seç * ..." öğesinden getirilen tüm sütunları kullansanız bile, şimdilik bu. Gelecekte tablo / görünüm düzenini değiştirir ve daha fazla sütun eklerseniz, ihtiyacınız olmasa bile bunları seçimlerinize getirmeye başlarsınız.

"Select *" ifadesinin kötü olduğu bir diğer nokta da görünüm oluşturmadır. "Seç *" kullanarak bir görünüm oluşturursanız ve daha sonra tablonuza sütunlar eklerseniz, görünüm tanımı ve döndürülen veriler eşleşmez ve yeniden çalışması için görünümlerinizi yeniden derlemeniz gerekir.

Bir "select *" yazmanın cazip olduğunu biliyorum, çünkü sorgularımdaki tüm alanları manuel olarak belirtmek istemiyorum, ancak sisteminiz gelişmeye başladığında, bu ekstra zamanı harcamanın faydalı olduğunu göreceksiniz / görünümlerinizdeki hataları gidermek veya uygulamanızı optimize etmek için daha fazla zaman ve çaba harcamak yerine alanları belirtme çabası.


GÖRÜŞLER üzerindeki nokta çok önemlidir. Tabloya sütunlar eklerseniz yalnızca tüm sütunları elde etmekle kalmayacaksınız (* düşünmenizi sağlayacak şeylere rağmen), aynı zamanda tablonun gerçek düzeniyle eşleşmeyebilirler.
Euro Micelli

3

Sütunları açıkça listelemek performans için iyi olsa da, delirmeyin.

Bu nedenle, tüm verileri kullanırsanız, sadelik için SEÇ * 'i deneyin (çok sayıda sütununuzun olduğunu ve JOIN ... sorgusunun kötüleşebileceğini hayal edin). Sonra - ölçün. Sorgu ile açıkça listelenen sütun adlarıyla karşılaştırın.

Performans hakkında spekülasyon yapmayın, ölçün!

Açık liste, büyük veriler (bir gönderinin veya makalenin gövdesi gibi) içeren bazı sütunlara sahip olduğunuzda ve belirli bir sorguda buna gerek olmadığında en çok yardımcı olur. Daha sonra yanıtınıza geri döndürmeyerek DB sunucusu zaman, bant genişliği ve disk veriminden tasarruf edebilir. Sorgu sonucunuz da daha küçük olacaktır; bu, herhangi bir sorgu önbelleği için iyidir.


3

Gerçekten yalnızca ihtiyacınız olan alanları ve yalnızca gereken sayıyı, yani

SELECT Field1, Field2 FROM SomeTable WHERE --(constraints)

Veritabanının dışında dinamik sorgular, enjeksiyon saldırıları ve hatalı biçimlendirilmiş veriler riski taşır. Genellikle bunu saklı yordamlar veya parametreli sorgular kullanarak alırsınız. Ayrıca (gerçekten bir sorun olmasa da), sunucunun her dinamik sorgu yürütüldüğünde bir yürütme planı oluşturması gerekir.


"Sunucu dinamik bir sorgu her yürütüldüğünde bir yürütme planı oluşturmak zorunda" hangi sorgu yavaşlatıyor varsayıyorum. Teşekkürler.
Ankur

Dinamik sql kullanmanın performans sorunları muhtemelen sadece çok yüksek yük senaryolarında gerçekleşir, Sql Server sorgu planlarını verimli bir şekilde yönetmede oldukça iyidir.
Matthew Abbott

2

* Veya sütun kullanıyorsanız, eşit derecede etkilidir (hız açısından).

Aradaki fark hız değil, hafıza ile ilgilidir. Birkaç sütun seçtiğinizde SQL Server, yalnızca birini kullanıyor olsanız bile, istediğiniz tüm sütunlara ilişkin tüm veriler de dahil olmak üzere, sorguyu sunmak için bellek alanı ayırmalıdır.

Performans açısından önemli olan şey, WHERE yantümcenize ve JOIN, OUTER JOIN, vb. Sayısına büyük ölçüde bağlı olan dışlama planıdır ...

Sorunuz için SELECT * kullanın. Tüm sütunlara ihtiyacınız varsa performans farkı yoktur.


2

Açık alan adlarını * yerine * kullanmak daha hızlı DEĞİLDİR, ancak tüm alanlar için veri almanız gerekiyorsa.

İstemci yazılımınız, döndürülen alanların sırasına bağlı olmamalıdır, bu da saçmalıktır.

Ve (olası olmasa da) tüm alanları * kullanarak almanız gerekebilir çünkü henüz hangi alanların mevcut olduğunu bilmiyorsunuz (çok dinamik veritabanı yapısını düşünün).

Açık alan adlarını kullanmanın bir başka dezavantajı, eğer çok sayıda varsa ve uzunsa, kod ve / veya sorgu günlüğünü okumayı zorlaştırır.

Kural şu ​​olmalıdır: tüm alanlara ihtiyacınız varsa * kullanın, yalnızca bir alt kümeye ihtiyacınız varsa bunları açıkça adlandırın.


2

Sonuç çok büyük. Sonuçları oluşturmak ve SQL motorundan istemciye göndermek yavaştır.

Genel bir programlama ortamı olan istemci tarafı, satır sayısı çok fazla olabileceğinden (örneğin on milyonlarca satır) sonuçları filtrelemek ve işlemek için tasarlanmamıştır ve tasarlanmamalıdır (örn. WHERE yan tümcesi, ORDER yan tümcesi).


Yani tüm farklı sütunları kullanmanız gerekiyorsa iyi olur ... ve veritabanınız ve uygulamanız yine aynı sunucuda oturuyorsa, çok fazla fark yaratmaz mı?
Ankur

@Ankur: Aynı sunucuda bile veri tabanı arayüzü üzerinden veri aktarmanın maliyeti vardır.
kennytm

2

Uygulamanıza girmeyi beklediğiniz her bir sütuna ad vermek, sütunlarınız hala mevcut olduğu sürece (herhangi bir sırayla) birisi tabloyu değiştirirse uygulamanızın bozulmamasını sağlar.


1

DB sunucunuzun sürümüne bağlıdır, ancak SQL'in modern sürümleri planı her iki şekilde de önbelleğe alabilir. Veri erişim kodunuzla en sürdürülebilir olanı seçin.


1

Tam olarak istediğiniz sütunları yazmanın daha iyi bir nedeni, tablo yapısında gelecekteki olası değişiklikler olabilir.

Bir veri yapısını sorgunuzun sonuçlarıyla doldurmak için dizin tabanlı bir yaklaşım kullanarak verileri manuel olarak okuyorsanız, gelecekte bir sütun eklediğinizde / kaldırdığınızda neyin yanlış gittiğini anlamaya çalışan baş ağrılarınız olacaktır.

Daha hızlı olana gelince, uzmanlıkları için başkalarına erteleyeceğim.


1

Çoğu problemde olduğu gibi, ne elde etmek istediğinize bağlıdır. Herhangi bir tablodaki tüm sütunlara izin verecek bir db ızgarası oluşturmak istiyorsanız, yanıt "Seç *" dir. Ancak, yalnızca belirli sütunlara ihtiyacınız varsa ve sorgudan sütun ekleme veya silme işlemi nadiren yapılırsa, bunları ayrı ayrı belirtin.

Ayrıca sunucudan aktarmak istediğiniz veri miktarına da bağlıdır. Sütunlardan biri not, grafik, damla vb. Olarak tanımlandıysa ve bu sütuna ihtiyacınız yoksa, "Seç *" ifadesini kullanmasanız iyi olmaz ya da istemediğiniz bir sürü veri alırsınız performansınız düşebilir.


1

Herkesin söylediklerine eklemek için, seçtiğiniz tüm sütunlarınız bir dizine dahil edilirse, SQL'den ek veri aramak yerine sonuç kümeniz dizinden alınır.



1

Yukarıdaki herkesin söyledikleri, artı:

Okunabilir bir bakım kodu arıyorsanız, şöyle bir şey yapın:

Foo, bar FROM widget'larını SEÇ;

anında okunabilir ve niyet gösterir. Bu aramayı yaparsanız, geri döndüğünüzü bilirsiniz. Widget'larda yalnızca foo ve çubuk sütunlar varsa, * işaretinin seçilmesi, geri döndüğünüz şeyi düşünmeniz gerektiği anlamına gelir, siparişin doğru bir şekilde eşleştirildiğini onaylar, vb. Ancak, widget'ların daha fazla sütunu varsa ancak yalnızca foo ile ilgileniyorsanız ve bar, bir joker karakter sorgusu yaptığınızda kodunuz dağınık hale gelir ve sonra yalnızca döndürülenlerin bazılarını kullanırsınız.


1

Bir iç birleşiminiz varsa tanım gereği, birleştirme sütunlarındaki veriler tekrarlandığından tüm sütunlara ihtiyacınız olmadığını unutmayın.

SQl sunucusunda sütunları listelemek zor hatta zaman alıcı değildir. Sadece nesne tarayıcısından sürükleyin (kelime sütunlarından sürükleyerek hepsini bir seferde alabilirsiniz). Sisteminize kalıcı bir performans isabeti koymak için (bunun dizinlerin kullanımını azaltabildiğinden ve ağ üzerinden gereksiz verilerin gönderilmesinden dolayı maliyetlidir) ve veritabanı değiştikçe beklenmedik sorunlarınız olma olasılığınızı artırın (bazen sütunlar kullanıcının örneğin görmesini istemezsiniz) sadece bir dakikadan az geliştirme süresi için kısa görüşlü ve profesyonelce.


1

Performans açısından her ikisinin de eşit olduğu yorumları gördüm. ancak kullanılabilirlik yönü bazı + 'lar ve

Bir sorguda (select *) kullandığınızda ve bazıları tabloyu değiştirip önceki sorgu için gerekli olmayan yeni alanlar eklediğinizde, bu gereksiz bir ek yüktür. Ve yeni eklenen alan bir damla veya bir görüntü alanı ise ??? o zaman sorgu yanıt süreniz gerçekten yavaş olacaktır.

Diğer yandan bir (col1, col2, .. seçin) kullanırsanız ve tablo değiştirilir ve yeni alanlar eklenirse ve sonuç kümesinde bu alanlar gerekiyorsa, tablo değişikliğinden sonra her zaman seçme sorgunuzu düzenlemeniz gerekir.

Ancak her zaman sorgularınızda select col1, col2, ... kullanmanızı ve tablo daha sonra değiştirilirse sorguyu değiştirmenizi öneririm ...


0

Her seferinde SEÇMEK istediğiniz sütunları kesinlikle tanımlayın. Olmamak için bir neden yok ve performans iyileştirmeye değer.

Asla "SELECT *" seçeneğini kullanmamalıydılar


0

Her sütuna ihtiyacınız varsa, SELECT * kullanın, ancak siparişin potansiyel olarak değişebileceğini unutmayın, bu nedenle sonuçları tüketirken bunlara dizinle değil adla erişin.

Nasıl * listeyi almak için gitmek gerekir hakkında yorum yoksaymak - şans ayrıştırılmış ve adlandırılmış sütunları doğrulama daha fazla değilse işlem süresine eşittir. ;-) zamanından önce optimize etmeyin


0

Yürütme verimliliği açısından önemli bir farkın farkında değilim. Ama programcıların verimliliği için alanların isimlerini yazardım çünkü

  • Numaraya göre dizine eklemeniz gerekiyorsa veya sürücünüz blob değerlerinde komik davranıyorsa ve kesin bir siparişe ihtiyacınız varsa siparişi biliyorsunuz.
  • Daha fazla alan eklemeniz gerekirse, yalnızca ihtiyacınız olan alanları okursunuz
  • Kayıt kümesinden / satırdan boş bir değer değil, bir alanı yanlış yazar veya yeniden adlandırırsanız sql hatası alırsınız
  • Neler olup bittiğini daha iyi okuyabilirsiniz.

0

hey, pratik ol. prototip oluştururken select * kullanın ve uygularken ve dağıtırken belirli sütunları seçin. yürütme planı perspektifinden bakıldığında, her ikisi de modern sistemlerde nispeten aynıdır. ancak, belirli sütunların seçilmesi diskten alınması, bellekte depolanması ve ağ üzerinden gönderilmesi gereken veri miktarını sınırlar.

sonuçta en iyi plan belirli sütunları seçmektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.