PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ Wichtig ] SELECT *


pate33
16.09.2002, 11:39
Hi,

nochmal an alle, die sql aus'm handbuch oder von tut's etc. gelernt haben ...

SELECT * sollte nur zu TESTZWECKEN und bei WIRKLICH BENOETIGTEN ABFRAGEN verwendet werden !

d.h. wenn ihr wirklich alle felder der tabelle auslesen wollt, dann koennt ihr das verwenden, in allen anderen fallen

SELECT feld1, feld2, feld3 FROM ...

verwenden, da select * DEUTLICH langsamer ist, als eine spezifizierte abfrage.

desweiteren ist es einfach nur schlechter programmierstil, eine select * abfrage zu gestallten.

MfG


Jan Krüger
16.09.2002, 11:43
ich benutze 'select *' hauptsächlich, wenn ich alle felder bis auf eins brauche und genau weiß, dass ich nur einen datensatz zurückgeliefert kriege :D

Jonas
16.09.2002, 17:35
Ausserdem hat es auch noch folgenden Vorteil: Wenn man in der entprechenden Programmiersprache nicht assoziative Arrays bei Queries benutzt, also a là $db_row['FeldName'], sondern numeristische, also $db_row[x], und sich dann in der Tabelle was ändert, also z.B. am Anfang der Tabelle eine Spalte hinzukommt, rutschen alle Indizes eine Stelle nach hinten, und man darf umschreiben.
Sagt man genau, welche Spalten man haben will, dann macht das nix aus, wenn am anfang eine weitere hinzukommt, weil man sie ja dann ans Ende der Abfrage schreiben kann...

belze
16.09.2002, 19:49
Ja, meine Rede. :)
Aber wenn ich nur 3 Spalten habe (wie zuletzt bei meinem GB), dann mache ich da auch mal :)

PHP_Atze
09.12.2002, 19:55
hmm

wieviel langsamer ist es denn?? Generell bei SQL-Datenbanken??
Was ist mit dem count(distinct ) befehl?? welche alternative gibt es??

pate33
09.12.2002, 21:39
du verwechselst da glaub ein paar sachen ...

also, es gibt ein select distinct. da musst du eh die feldnamen angeben, da geht kein *.

bei count() solltest du das feld mit dem primary key - im meisten falle id - verwenden. da kannst du sicher sein, dass es nen index gibt, und das feld auf NOT_NULL steht, d.h. dass immer ein wert drinsteht. (wenn es ein feld gibt, in dem null steht, wird es von count() _nicht_ mitgezaehlt!!

count(distinct ...) waer afaik bloedsinn. ;)

und, bei einer kleinen db macht es kaum unterschied, ob select * oder select felder ..., jedoch sollte man auch da auf ordentliche programmierung achten, und select * ist nicht ordentlich, sondern faul! ;)

bei groesseren datenbanken (ab 100.000 sag ich mal) kann es durchaus zu spuerbaren unterschieden kommen.

so long

PHP_Atze
12.12.2002, 13:40
hmm

count(distinct...) hat einen wichtigen Sinn!
es zählt jeden Eintrag nur einmal auch wenn er öfter vorkommt!

Die Frage von mir ist halt ob es eine schnellere Query gibt!

pate33
12.12.2002, 13:51
count(id) group by id;

;)

PHP_Atze
12.12.2002, 14:04
hmm ok bei einer Tabelle.
Ich hab drei Tabellen die einander untergeordnet!
Tabelle 1 sind x Einträge aus Tabelle 2 zugeordnet der wieder y Einträge aus Tabelle 3 zugeordnet zugeordnet.

select tabelle1.ID_tab1,
count(distinct tabelle2.ID_tab2), count(distinct tabelle3.ID_tab3)
from tabelle1, tabelle2, tabelle3
where tabelle2.tab1_ID = tabelle1.ID_tab1
and tabelle3.tab2_ID = tabelle2.ID_tab2
group by tabelle1.ID_tab1;


geht das auch besser???

pate33
12.12.2002, 14:54
von zeilenumbruechen hast du noch nix gehoert, oder? :D


select tabelle1.ID_tab1,
count(distinct tabelle2.ID_tab2),
count(distinct tabelle3.ID_tab3)
from tabelle1,
tabelle2,
tabelle3
where tabelle2.tab1_ID = tabelle1.ID_tab1
and tabelle3.tab2_ID = tabelle2.ID_tab2
group by tabelle1.ID_tab1;



select tabelle1.ID_tab1,
count(tabelle2.ID_tab2),
count(tabelle3.ID_tab3)
from tabelle1,
tabelle2,
tabelle3
where tabelle2.tab1_ID = tabelle1.ID_tab1
and tabelle3.tab2_ID = tabelle2.ID_tab2
group by tabelle1.ID_tab1,
tabelle2.ID_tab2,
tabelle3.ID_tab3


sollte eigentlich theoretisch gehen ... :D

aber normal wuerd ich so ne abfrage mit unterabfragen loesen ... ;)

PHP_Atze
12.12.2002, 15:13
hmm funzt nicht ganz! Jetzt wirft er jedes Ergebnis heraus und nicht nur die Unterschiedlichen!!!
In Zahlen:
Jetzt hab ich eine Ergebnismenge von 67663;
Mit meiner 20 halt für jede Zeile in tabelle1 einen!;

spezi^
25.05.2005, 16:25
kenn nur 'select * from [tabelle]' und gibt dann alle zeilen an ...
praktisch isses aufjedenfall find ich ... um sich eine vollständige tabelle anzusehen ... zwar wirds richtig übel wenn in der db paar hundert einträge sind, aber bei kleineren isses ja ok :>

und wenn, würd ich sowas eh über 'VIEW' mache, da ich dann angeben kann welche spalten ich sehen will ^^

~Paladin~
25.05.2005, 21:59
aber normal wuerd ich so ne abfrage mit unterabfragen loesen ... ;)

Ich würde die Abfrage auch noch in Joins packen :D

Bzw. verstehe ich den Sinn von diesem count(distinct) nicht und ich glaube auch noch in Erinnerung zu haben, dass selbst, wenn diese Schreibweise funktioniert sie kaum dem ansi SQL- Standard entspricht. SELECT DISTINCT wäre da wohl eher richtig. Nun warum ich den Sinn nicht verstehe. Wenn ich die Anzahl der Datensätze herrausbekommen möchte und dabei ein COUNT() auf den Primary Key absetze, wieso sollen da keine doppelten Einträge gezählt werden, wenn der Primary Key eh eindeutig sein muss?

Und on Topic:

SELECT * ist langsam, weil das DBMS erst das * in die Feldnamen auflösen muss. Hierdurch wird die Performance vermindert. Bei wenigen Spalten bzw. wenigen Datensätzen, mag das ja noch nicht spürbar sein aber sobald man sich in Datenbanksystemenen wie Oracle, MS SQL Server oder doch MySQL mit Inno DB Tabellen bewegt, dann sollte man diese Möglichkeit komplett aus dem Gedächtnis streichen. Es ist nicht einmal zum Testen sinnvoll.

doped04
30.08.2005, 12:32
Ist es dann also schneller, alle Felder anzugeben als ein * wenn man alles raussucht? (Den Vorteil, dass man nachher die spaltennamen im programmcode sieht den gibts ja eh ;)

Jan Krüger
30.08.2005, 12:37
Wenn du sowieso den Inhalt aller Felder benötigst, dann nicht. In sehr vielen Fällen braucht man aber eben *nicht* alle, und dann kann man Performance (und RAM-Entlastung) gewinnen, wenn man die benötigten Spalten einzeln angibt.

andnotexists
16.05.2006, 16:58
Wieso denn nicht???
Ich brauche den select * immer wenn ich ein query schreibe. Denn dann sehe ich allle felder und kann dem user vielleicht noch etwas spezielles liefer, an was er gar nicht gedacht hat.
Ich mache aber jedenfalls immer noch folgendes. Ich schränkte die abfrage ein.
Select *
From tabelle1.db a, tabelle2.db b
where a.nummer = 666666666
Also frage ich nur einen eintrag ab.


Hi,

nochmal an alle, die sql aus'm handbuch oder von tut's etc. gelernt haben ...

SELECT * sollte nur zu TESTZWECKEN und bei WIRKLICH BENOETIGTEN ABFRAGEN verwendet werden !

d.h. wenn ihr wirklich alle felder der tabelle auslesen wollt, dann koennt ihr das verwenden, in allen anderen fallen

SELECT feld1, feld2, feld3 FROM ...

verwenden, da select * DEUTLICH langsamer ist, als eine spezifizierte abfrage.

desweiteren ist es einfach nur schlechter programmierstil, eine select * abfrage zu gestallten.

MfG

Jan Krüger
16.05.2006, 17:32
Wie Patrick schon sagte, wenn du tatsächlich alle Felder brauchst, ist das kein großes Problem.

Der eigentliche Knackpunkt bei SELECT * ist, dass man bei größeren Abfragen (und dann evtl. auch noch mit vielen zurückgelieferten Datensätzen) dadurch viel mehr Felder zieht und der Speicherverbrauch deutlich steigt. Wenn du nur einen einzigen Datensatz brauchst und der nicht gerade riesige Binary Blobs beinhaltet, die du gerade gar nicht brauchst, ist SELECT * durchaus in Ordnung.

andnotexists
16.05.2006, 17:43
Klar, sorry habe den beitrag von patrick überlesen.
Aber eines mache ich immer wieder, am wochenende oder am abend, wenn keiner mehr die db braucht (die tev durch ist), mache ich doch gerne einen select *. Ich übertreibe nicht, wenn ich schreibe, an einem werktag, wenn alle 1300 user arbeiten, braucht ein ganz einfaches query, ich sage mal, 10 min.. Am wochende aber nur ein paar sek.
Free power......

Wie Patrick schon sagte, wenn du tatsächlich alle Felder brauchst, ist das kein großes Problem.

Der eigentliche Knackpunkt bei SELECT * ist, dass man bei größeren Abfragen (und dann evtl. auch noch mit vielen zurückgelieferten Datensätzen) dadurch viel mehr Felder zieht und der Speicherverbrauch deutlich steigt. Wenn du nur einen einzigen Datensatz brauchst und der nicht gerade riesige Binary Blobs beinhaltet, die du gerade gar nicht brauchst, ist SELECT * durchaus in Ordnung.

Jan Krüger
16.05.2006, 17:46
Wenn das so lange dauert, sollten sich wahrscheinlich mal ein paar Leute Gedanken über die Optimierung ihrer Datenbankstrukturen und -anwendungen machen...

pate33
16.05.2006, 19:12
jepp, wuerde ich auch sagen. ;)

Du kannst als DB Admin die abgesetzten Statements ueberpruefen und die entsprechenden (schuldigen) Entwickler auf die Verwendung von 'select *' etc. belehren ... Das waere der erste Schritt zur Optimierung. ;)