2016-07-26 11 views
0

Ich habe darüber gelesen und ich verstehe, dass es besser ist, die Spaltennamen explizit aufzulisten, habe ich noch eine Frage.Wählen Sie * vs Alle Spaltennamen auswählen

Lassen Sie sich das folgende Szenario vorgeben (was zu meinem wirklichen Leben Szenario ganz in der Nähe):

  1. Neue Spalten werden nie

  2. Ich benutze keine Datenblob

  3. hinzugefügt werden Ich möchte eigentlich alle Spalten zurückgeben
  4. Ich habe eine Tabelle mit etwa 140 Millionen Zeilen
  5. I Brauche eigentlich nicht alle 140 Millionen Zeilen, aber lass uns einfach so tun, um zu argumentieren
  6. Ich verwende keine Joins und niemand anderes wird
  7. Die Abfragen unten sind buchstäblich genau, wie ich die Abfragen ausführen werde .

Gibt es einen Unterschied in der Leistung zwischen den folgenden Abfragen:

select * 
from table 

vs

select every_column_name 
from table 

Edit: Ich verstehe, dass es eine Million Fragen zu diesem Thema ist. ABER FÜR DIESES BESONDERE SZENARIO gibt es irgendeine Art von Leistungsunterschied? Ist select * immer noch fehlerhaft oder haben beide Abfragen dieselbe Leistung?

Von was ich sagen kann, basierend auf den Ergebnissen der Verwendung explain, gibt es keinen Unterschied für diesen speziellen Fall.

+1

Die Verwendung von 'select *' kann insbesondere bei Ad-hoc-Abfragen nicht schaden. Es gibt einige Risiken, aber Sie scheinen sie zu verstehen, also können Sie eine gute Entscheidung darüber treffen, was in Ihrem speziellen Fall am besten funktioniert. –

Antwort

2

Dies ist eine Ausarbeitung zu meinem Kommentar.

Es ist definitiv nicht schaden, select * für eine Ad-hoc-Abfrage zu verwenden. Es ist eine große Bequemlichkeit und üblich.

Das Problem tritt auf, wenn Sie dieselbe Abfrage im Laufe der Zeit ausführen möchten. Insbesondere wenn die Abfrage kompiliert wird, können Änderungen an der zugrunde liegenden Tabelle zu unerwarteten Problemen führen. Ich erinnere mich "zärtlich" daran, etwa 10 Stunden mit dem Debuggen eines Problems (beginnend um 6.00 Uhr morgens) verbracht zu haben, das durch eine select * in einer View verursacht wurde, als ein Spaltentyp in der zugrunde liegenden Tabelle geändert wurde. Der Code wurde nicht neu kompiliert und die Offsets in den Datensätzen waren deaktiviert.

Auch diese Situation kann durch Erzwingen einer Neukompilierung behoben werden. Und ich verwende häufig SELECT * in Ad-hoc-Abfragen.

Ihre Frage fasst einige der wichtigsten Punkte zusammen, z. B. breite Spalten, die eine Abfrage verlangsamen.

+0

"Der Code wurde nicht neu kompiliert und die Offsets in den Datensätzen waren aus" --- also wurden in den Spaltenindexen keine Namen verwendet?o_O – zerkms

+0

@zerkms. . . Wenn Code kompiliert wird, wird der Speicherort der Spalten als Offsets und andere Informationen gespeichert. Der symbolische Name der Spalte wird nicht verwendet. –

+0

Welche Programmiersprache ist das? PSQL? – zerkms

0

Es gibt keinen Leistungsunterschied zwischen ihnen. Wenn das DBMS die zwei Anweisungen analysiert, erzeugt es die gleiche Abfrage. Das heißt, * ist eine Verknüpfung für jeden Spaltennamen.