Gegeben Ihr Spezifikation, die Sie sind alle Spalten auswählen, gibt es kaum einen Unterschied zum jetzigen Zeitpunkt . Beachten Sie jedoch, dass sich Datenbankschemata ändern können. Wenn Sie *`SELECT `** erhalten Sie alle neuen Spalten, die der Tabelle hinzugefügt werden, auch wenn Ihr Code höchstwahrscheinlich nicht darauf vorbereitet ist, diese neuen Daten zu verwenden oder darzustellen. Dies bedeutet, dass Sie Ihr System unerwarteten Leistungs- und Funktionsänderungen aussetzen.
Sie sind vielleicht bereit, dies als geringfügige Kosten abzutun, aber Sie sollten sich darüber im Klaren sein, dass Säulen, die Sie nicht brauchen, trotzdem vorhanden sein müssen:
- Lesen aus der Datenbank
- Über das Netzwerk gesendet
- Eingebunden in Ihren Prozess
- (für ADO-artige Technologien) Gespeichert in einer Daten-Tabelle im Speicher
- Ignoriert und weggeworfen / im Müll gesammelt
Punkt 1 hat viele versteckte Kosten, einschließlich der Beseitigung einiger potenzieller abdeckender Indizes, der Belastung von Datenseiten (und des Cache des Servers) und der Verursachung von Zeilen-/Seiten-/Tabellensperren, die ansonsten vermieden werden könnten.
Wägen Sie dies gegen die potenziellen Einsparungen ab, die durch die Angabe der Säulen im Vergleich zu einer *``** und die einzigen möglichen Einsparungen sind:
- Der Programmierer muss die SQL nicht erneut aufrufen, um Spalten hinzuzufügen.
- Der Netzwerk-Transport des SQL ist kleiner / schneller
- SQL Server Abfrage Parse-/Validierungszeit
- SQL Server Abfrageplan-Cache
Für Punkt 1, die Realität ist, dass Sie gehen, um hinzuzufügen / ändern Sie den Code, um jede neue Spalte, die Sie sowieso hinzufügen könnte, so ist es eine Wäsche.
Bei Punkt 2 ist der Unterschied selten groß genug, um eine andere Paketgröße oder Anzahl von Netzwerkpaketen zu erreichen. Wenn Sie an einen Punkt gelangen, an dem die Zeit für die Übertragung von SQL-Anweisungen das Hauptproblem darstellt, müssen Sie wahrscheinlich zuerst die Anzahl der Anweisungen reduzieren.
Bei Punkt 3 gibt es KEINE Einsparungen, da die Erweiterung des *``** ohnehin geschehen muss, was bedeutet, dass das Tabellenschema ohnehin konsultiert werden muss. Realistischerweise verursacht die Auflistung der Spalten die gleichen Kosten, da sie anhand des Schemas validiert werden müssen. Mit anderen Worten: Es ist ein kompletter Reinfall.
Für Punkt 4, wenn Sie bestimmte Spalten angeben, könnte Ihr Abfrageplan-Cache größer werden, aber nur wenn es sich um verschiedene Spaltengruppen handelt (was Sie nicht angegeben haben). In diesem Fall müssen Sie wollen verschiedene Cache-Einträge, da Sie je nach Bedarf verschiedene Pläne wünschen.
Aufgrund der Art und Weise, wie Sie die Frage formuliert haben, läuft alles auf das Problem der Widerstandsfähigkeit angesichts eventueller Schemaänderungen hinaus. Wenn Sie dieses Schema in ROM brennen (was vorkommt), dann wird ein *``** ist vollkommen akzeptabel.
Meine allgemeine Richtlinie lautet jedoch, dass Sie nur die Spalten auswählen sollten, die Sie benötigen, d. h. manchmal Es sieht so aus, als würden Sie nach allen Spalten fragen, aber DBAs und Schemaentwicklungen bedeuten, dass einige neue Spalten auftauchen können, die die Abfrage stark beeinflussen können.
Mein Rat ist, dass Sie ALWAYS SELECT bestimmte Spalten . Denken Sie daran, dass man gut wird in dem, was man immer wieder tut, also gewöhnen Sie sich an, es richtig zu machen.
Wenn Sie sich fragen, warum sich ein Schema ändern kann, ohne dass sich der Code ändert, denken Sie an die Audit-Protokollierung, das Gültigkeits-/Ablaufdatum und ähnliche Dinge, die von DBAs aus Gründen der Systemkonformität hinzugefügt werden. Eine weitere Quelle für unbemerkte Änderungen sind Denormalisierungen zur Leistungssteigerung an anderer Stelle im System oder benutzerdefinierte Felder.