Utsikter från en balkong i Varberg

Kör inte SELECT * (star)

Posted in Datorer by Martin Bagge / brother on 30/9 2008

Eftersom jag sprang på en bra text som förklarar precis det jag tänkt om SELECT * i SQL så tänkte jag slänga in den här så att man kan hitta tillbaka till den i framtiden.

Rudy Limeback skriver bl.a. följande i ”Why SELECT star is bad”:
Imagine using SELECT * to retrieve rows from a table which includes a TEXT or BLOB column. A TEXT or BLOB column is large, and is used to store data like the contents of a chapter in a book, or an image.

If you do not intend to display the TEXT or BLOB column, for example if you wanted a list of the last 25 entries this week, then it is immediately obvious that SELECT * is bad when you display the query results on the screen or printer. You don’t see a list, you see many kilobytes of TEXT or BLOB data.

Alltså, det är ett minnesproblem.
De allra flesta gånger då datat transporteras från databasen till GUI så populeras någon typ av minne (är väl bara om man skriver det rakt ut på en printer som detta är falskt) och då måste datat sparas någonstans. Om meningen är att visa precis allt i tabellen vid varje givet tillfälle så är det ju inte mycket att bry sig om, se till att optimera det du kan istället men om tanken är att ta ID-nummer, datum och rubrik på de senaste 25 artiklarna så är det bra onödigt att spara ner hela artikeltexten, författaren och whatnot i minnet innan du kastar bort det. Genom att specificera precis det som behövs så blir dessutom SQL-frågan specifik och tydlig för den som läser koden.
I en del programspråk använder man dessutom kolumnräknare för att nå rätt i resultatet, då kan man inte byta datamodell utan att säkerställa att alla kolumner ligger i den ordning som det var tänkt. Om jag förväntar mig artikelns rubrik som kolumn tre och den ligger som kolumn fyra så kommer koden att vara trasig om jag inte specificerar kolumnerna i rätt ordning i SELECT.

Läs även andra bloggares åsikter om , , , ,

Annonser
Tagged with: , , ,

2 svar

Subscribe to comments with RSS.

  1. Jonas Birgander said, on 1/10 2008 at 11:56

    Ett annat argument för att inte använda SELECT * är att det försvårar när man vill hitta var en specifik kolumn används. T.ex. om man skulle få för sig att ta bort eller ändra på en kolumn.

    SELECT * bör helt enkelt undvikas.

    (titta brother, jag hittade till din nya blogg också :))

  2. brother said, on 2/10 2008 at 02:23

    precis, ”Genom att specificera precis det som behövs så blir dessutom SQL-frågan specifik och tydlig för den som läser koden.”.

    Så himlans hemlig är ju inte adressen. Den gamla URLen leder hit osv


Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s

%d bloggare gillar detta: