Ich habe gehört, dass 'Select *' zu der Zeit hinzugefügt wird, die SQL Server benötigt, um den Abfrageausführungsplan zu erstellen, da er herausfinden muss, welche Spalten in den referenzierten Tabellen vorhanden sind. Gilt das gleiche für eine Abfrage, die auf einer View statt auf einer Tabelle basiert?Welche Auswirkungen hat 'select *' auf die Erstellung des Ausführungsplans?
Antwort
Ja; der Spaltenentdeckungsprozess muss noch stattfinden. "select *
" sollte niemals in einer Produktionsanwendung oder einem Produktionsprozess verwendet werden. Sie sollten IMMER explizit die spezifischen Daten definieren, die Sie abrufen möchten.
Ich würde wetten, dass die Zeit in beiden Fällen vernachlässigbar ist; Sie sollten jedoch vermeiden, aus anderen Gründen * zu wählen.
Mit Auswahl * können mehr Daten zurückgeben, was Sie möglicherweise benötigen, die abhängig von den Daten erheblich sein könnten. Dann gibt es Probleme, bei denen, wenn Sie eine Spalte entfernen, Ihre Abfrage möglicherweise noch funktioniert; Der konsumierende Code kann jedoch fehlschlagen. Sie verlieren wirklich die Fähigkeit zu bestimmen, ob jemand diese Spalte benutzt.
Vernachlässigbare Zeit. Ja, wenn es auf eine Tabelle angewendet wird, gilt es für eine Ansicht.
Aber in 12 Jahren SQL zu tun, habe ich noch eine Abfrage beschleunigt sehen durch explizite Benennung von Spalten anstelle von *
.
in der Produktion Code, ich verwende nicht *
, aber das ist aus Gründen der Herstellung Code bedeuten, was sie sagt, nicht die Effizienz, und da, um Materie kann, wenn zu einem Ergebnis verbindlich festgelegt
In der Produktion Ansicht, I werde *
verwenden, wenn die Absicht der Ansicht (wenn "was ich meine zu sagen") "alle Spalten einbringen" ist; Auf diese Weise werden bei einer Neukompilierung einer Ansicht Tabellenänderungen übernommen. Ordnung spielt in einer Ansicht keine Rolle; nur in der clientseitigen Abfrage, die die Ansicht verwenden kann.
Auf Bearbeitung: lassen Sie mich beachten, dass eine Ansichtsdefinition wird einmal analysiert (bis es neu kompiliert wird), wenn die Ansicht erstellt wird, nicht, wenn es verwendet wird. So die winzige Menge an Zeit von *
zu column1, c2, d3, foobar
kommt einmal, zu der Zeit die create view
wird an den Server db gesendet.
Nun, zurück zu bringen alle Spalten an den Client wird langsamer sein als nur eine zurückbringen (obwohl in der Regel nicht viel). Aber das ist ein anderes Thema.
Es gibt keinen Unterschied in Bezug auf die Abfrage-Plan, sondern Spalten explizit definiert, ist eine gute Übung für eine Reihe von Gründen in Betracht gezogen, darunter:
- Hinzufügen von Spalten in der Tabelle nicht Legacy-Code brechen, der davon abhängt das alte Spaltensetup.
- Die Auswahl von Daten aus Spalten, die Sie nicht benötigen, bedeutet mehr Datentransfer, was oft der langsamste Teil beim Abrufen von Daten aus der Datenbank ist.
Stellen Sie eine Tabelle wie folgt aus:
CREATE TABLE t_test (id INT NOT NULL PRIMARY KEY, value1 INT, value2 INT, aux_value VARCHAR(200))
CREATE INDEX ix_test_values ON (value1, value2)
Dann möchten Sie alle Werte innerhalb eines bestimmten Bereichs wählen:
SELECT value1, value2
FROM t_test
WHERE value1 BETWEEN 10 AND 20
In diesem Fall wird SQL Server
scannen einfach den Index ix_test_values
. Alles, was Sie wissen wollen, ist in diesem Index enthalten, deshalb ist nur die erforderlich. Jetzt
Sie Ausgabe:
SELECT *
FROM t_test
WHERE value1 BETWEEN 10 AND 20
SQL Server
braucht jetzt id
und aux_value
zusammen mit value1
und value2
auszuwählen. Diese Werte sind nicht im Index enthalten. Deshalb sollten Sie für jedes Indexblatt SQL Server
in die Tabelle selbst schauen und die Werte von den Tabellenseiten abrufen.
Dieser Vorgang dauert 4
bis 10
mal länger als ein einfacher Index-Scan, abhängig davon, wie komplex die Tabellenstruktur ist und wie viele Seiten in den Speicher passen.
Ich habe gehört, mit ‚* wählen Sie‘ zu der Zeit, SQL Server hinzufügen werde nimmt den Abfrageausführungsplan zu bauen, wie es muss herauszufinden, welche Spalten auf die referenzierten Tabellen vorhanden sind.
Denken Sie darüber nach. Was macht SQL Server, wenn Sie senden:
SELECT ID, col1, col2, col3
FROM table
Die Aussage darüber überprüfen und sehen, nicht bedeutet, wenn ID, col1, col2, usw. in der Tabelle vorhanden sind -, dass es dann nehmen Sie nur Ihr Wort es? Meine Güte nein! : D
Es wird in den Systemkatalogen nachsehen, ob diese Spalten existieren. Etwas, das intern praktisch identisch ist zu sagen:
SELECT * FROM table
Es gibt viele Gründe, um nicht Verwendung SELECT * (sie haben bisher in dieser Liste aufgezählt wurden), aber behauptet, dass es messbar fügt hinzu, sinnvoll Overhead zu Abfrage Zeit ist einfach nur dumm. Also, wenn jemand versucht, dir das zu sagen, bitte korrigiere sie :)
- 1. Welche Auswirkungen hat ITIL oder CMMI auf die Entwicklung?
- 2. Welche Auswirkungen hat die Virtualisierung auf kryptografisch starke Zufallsgeneratoren?
- 3. Welche Auswirkungen hat der Zugriff auf einen Windows-Registrierungswert?
- 4. Erläuterung des Ausführungsplans in Oracle
- 5. Die Auswirkungen des Designs auf die Anwendungslaufzeit
- 6. Welche Auswirkungen hat die Verwendung von "niedriger" Sicherheit in CakePHP?
- 7. Welche Auswirkungen hat __attribute__ ((__packed__)) auf verschachtelte Strukturen?
- 8. Hat glColorMask Auswirkungen auf glClear
- 9. Welche Auswirkungen hat die Verwendung von Boost/Format auf die Sicherheit?
- 10. Timeout-Parameter hat keine Auswirkungen auf Titanium.Network.createHTTPClient
- 11. Welche Auswirkungen hat die Änderung eines von ColdFusion generierten WSDL-Webdiensts von RPC-codiert auf Dokumentliteral?
- 12. Die Verwendung von LoadLevel hat Auswirkungen auf Licht
- 13. Hat ein typedef selbst Auswirkungen?
- 14. Was ist ein CTE-Scan und welche Auswirkungen hat er auf die Leistung?
- 15. Welche Auswirkungen hat die Änderung eines Symbols von .globl auf .weak?
- 16. Das Ändern von AppSetting hat keine Auswirkungen auf die Anwendung
- 17. Welche Auswirkungen hat das Ausführen von Python mit dem Optimierungsflag?
- 18. Welche Auswirkungen hat das Importieren nur einige Funktionen eines Moduls
- 19. Web.config überschreiben hat keine Auswirkungen auf Benutzersteuerelemente
- 20. Welche Auswirkungen hat die Einrichtung eines Index für das Varchar-Feld?
- 21. Hat scheinbarer Dateiname Auswirkungen auf SEO?
- 22. Hat HTTPS Auswirkungen auf HTML-Seiten?
- 23. Hat das Keyword final Auswirkungen auf die JVM?
- 24. Hat die Implementierungsdefinition von char Auswirkungen auf std :: string?
- 25. Hat die deklarierte Größe eines Varchar-Feldes Auswirkungen auf PostgreSQL?
- 26. Hat eine große Klasse Auswirkungen auf die Leistung?
- 27. Welche Auswirkungen hat Delphi 2009 (falls vorhanden) auf Unicode (/ UTF16) auf ausführbare Größe und Speicherbedarf?
- 28. Matplotlib: cbar.set_xticklabels hat keine Auswirkungen
- 29. Magento 1.4.2 + APC: Das Löschen des Cache hat keine Auswirkungen auf die Änderung der Einstellungen
- 30. Welche Auswirkungen hat die Registrierung einer Instanzmethode mit atexit in Python?