PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   Ich willst jetzt wissen - Select * oder nicht Select * (http://www.selfphp.de/forum/showthread.php?t=1920)

CyberAge 12.08.2002 10:48:13

Ich willst jetzt wissen - Select * oder nicht Select *
 
Also es kommt ja immer wieder die diskussion auf, ob select * gut oder schlecht ist, wenn man auf eine datenbank zugreift. Also ich finde, es ist in ordnung, da es einem sehr viel arbeit erspart! was ist wenn man eine tabelle hat, die 123* spalten hat und man nur 15 davon nicht braucht. ich möchte mal ehrlich wissen, wer sich die arbeit machen würde, alle spalten namentlich in die Select-anweisung aufzunehmen. Dort liegt doch auch gleich wieder eine Fehlerquelle: einmal ein ` vergessen und schon hat man einen SQL-Fehler und darf in die 123* spaltennamen in der Select-anweisung suchen.

Ich verwende, außer wenn ich wirklich nur eine oder 2 spalten brauche so gut wie immer Select * und meine Projekte laufen ohne probleme in sachen lauffähigkeit und geschwindigkeit.

Ich möchte es nun wissen: Was ist besser? Select * oder nicht Select * ???

Bitte zitiert aber nicht bisher geschriebenes (also hier im forum) sondern fasst es mit eigenen worten!

HS-78 12.08.2002 11:08:22

Also select * ist nicht besser. Bisher habe ich es zwar auch immer genutzt, aber nach der Diskussion hier hab ich in meinem aktuellen Projekt das umgestellt. Und select * hat folgenden Nachteil:

Es ist fast immer langsamer (selbst getestet), bei mir so zwischen 0-40% je nach Abfrage.

Es besteht die Gefahr das dieser Unterschied noch größer wird wenn eine Tabelle um neue Spalten erweitert wird.

Mit select spalte, .... hat man auch gleich den Vorteil das man sieht was nun eigentlich abgefragt wird. Das finde ich mittlerweile ganz gut.

Bezüglich der Übersichtlichkeit bei Tabellen mit 123* Spalten kann ich nur sagen das meiner Meinung nach etwas faul ist wenn eine Tabelle soviele Spalten hat ;-)

Es gibt aber auch Fälle, so wie von Dir schon angedeutet, da nehme ich auch Select *. So in meiner AdressDB, wo ich bei der Anzeige der Adressen 15 von 16 Feldern brauche.

Aber insgesamt werde ich in Zukunft vermeiden select * zu nutzen.

So, das waren meine 5 cents dazu,

HS.

SPiC 12.08.2002 11:18:06

Sorry, CyberAge, aber ich quote mich mal ganz schnell selber...
Zitat:

Hmm, lasst mich es mit dem Blinker am Auto vergleichen. Du kannst auch gefahrlos abbiegen, ohne den Blinker zu setzen, wenn keine Autos auf der Straße sind. Bei vielen Autos kommt es ohne Blinker schon einmal zum Crash...
Mit anderen Worten: Bei kleinen Projekten läuft SELECT * noch ganz gut, aber sagen wir mal bei eBay wäre eine "SELECT * FROM Auktionen" warscheinlich der Grund für einen Systemcrash...
SELECT * oder nicht SELECT *, dass unterscheidet eben das eben zusammengeschusterte Script von der Heavy Duty Application.

Zu Deinem 123-Spalten-Beispiel (wer in Gottes Namen nimmt Tabellen mit mehr als 100 Spalten?):

Also nehmen wir einmal an, Du würdest 15.000 Datensätze (also z.B. eine Kundendatenbank von einem mittleren Unternehmen) haben. Wenn Du jetzt einen Result abfragst, selektierst Du 15 Datenfelder zu viel, dass heißt, bei einem Result von 1000 Datensätzen hättest Du 15.000 Datenfelder "Müll" selektiert, die gespeichert werden müssten, obwohl Du sie gar nicht verwendest... Dann nehm noch den Faktor "User" dazu, denn es wird ja meist parrallel an den Datenbanken gearbeitet et voila: Bei zehn Usern sind es über 150.000 Datenfeld umsponst (Du hast somit wertvolle Resourcen vergeudet, mit denen man locker 1 1/2 User mehr bedienen könnte (108000 Datenfelder/User).

Jetzt stelle Dir mal das ganze mit 10.000.000 Datensätzen vor!

By the way, in der Praxis werden Tabellen gesplittet, d.H. ein Key wird vergeben und verschiedene Datengruppen auf verschiedene Tabellen gesplittet z.B.

Tabelle PersDaten
ID|KdnNr|Name|Vorname...

Tabelle ServiceProfill
ID|Zuständiger Sachbearbeiter für Kunden|Typ des Services...

Tabelle LogistikDaten
ID|Lieferadresse|...

Tabelle BuchhaltungsDaten
ID|Rechnungsadresse|...

So können riesige Datenmengen übersichtlich sortiert werden.
Mal ehrlich: Welche Tabelle hat denn mehr als 20 Felder?

Außerdem ist es schlichtweg viel übersichtlicher, wenn Du direkt aus der SELECT-Anweisung die Namen der Selektierten Datenfelder ersehen kannst, so hat vor allem ein neuer Programmierer viel schneller den Überblick.

=:-) Sebastian

PS: Mich würde mal ein Beispiel interessieren, wo wirklich mehr als 100 Felder benötigt werden....

Progman 12.08.2002 12:00:28

13.14. Warum soll ich nicht SELECT * schreiben?
http://www.dclp-faq.de/q-sql-select.html

Interessant ist es bei

SELECT COUNT(*) FROM tab

da soll man wieder * benutzen ;)

Ben20 12.08.2002 12:08:57

Ich habe früher im SELECT * benutzt, dann aber auf SELECT spaltenname umgestellt, da ich beim Programmieren meistens nicht mehr wußte in welcher Reihenfolge die Spalten in meiner Tabelle waren und ich ständig alles aufschreiben oder nachschauen mußte.

CyberAge 12.08.2002 12:16:24

vielleicht kann ja mal einer ein beispiel schreiben, was die performance von select * gegenüber select `spalte` aufzeigt. Aber ich bitte darum, den quelltext offenzulegen, damit sich jeder über die richtigkeit des scriptes überzeugen kann. Ich hab leider keine zeit, muß gleich zur mittagschicht! ich bin ja mal gespannt auf die ergebnisse!

Matt 12.08.2002 12:40:01

könnt ihr ganz einfach selbst testen mit der mysql benchmark funktion.

anwendungsbeispiel:
select benchmark(10000,"select * from user");
select benchmark(10000,"select name, alter from user");

benchmark führt argument2 argument1-mal aus, also praktisch 10000 selects
die zeit, die das gebraucht hat, könnt ihr euch merken und mit einer anderen zeit vergleichen.

SPiC 12.08.2002 13:00:57

@Progman
SELECT COUNT() ist eine Sache für sich (von der Syntax her).
SELECT COUNT liefert die Anzahl der Datensätze zurück, nicht die Daten (wie SELECT * FROM es tut).

Der Paramenter COUNT(*) zählt alle Datensätze in der Datenbank, während z.B. COUNT(name) nur alle Datensätze im Feld "name" zählt, die nicht NULL (also nicht leer) sind.


Viele Grüße


=:-) Sebastian

Nev 12.08.2002 13:56:10

Hi @ll

Ich muß mich HS-78 anschliessen

Es ist schneller, und übersichtlicher.
Wenn ich aber 14 Felder von einer Tabele die 16 Spalten hat, brauche, dann werde ich auch * verwenden.

zu Count
da muß ich SPiC rechtgeben


PS:
Ich bin sehr Froh das SPiC den Weg in dieses Forum gefunden hat, er bringt wieder frischen Wind herrein.
bzw. er gibt sehr gerne sein Wissen weiter.
Ich hoffe das ich bald auch wieder etwas mehr Zeit habe und wir alle Zusammen ein gutes Team abliefern.

@SPiC das angebot für Self-Examples steht noch immer

SPiC 12.08.2002 16:04:05

@Nev: Habe ich das Angebot nicht schon angenommen???

=:-) Sebastian


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:43:32 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.