Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Platzhalter

Um Ihre Frage zu beantworten, muss sie ein wenig auseinandergenommen werden:

SELECT * hat 3 Hauptarten von Nachteilen:

  • Codewartung:Die Verwendung von SELECT * verringert die Lesbarkeit für komplexe Tabellen/Abfragen und kann Probleme verursachen, wenn eine Client-Anwendung ein bestimmtes Ergebnis von einer Abfrage erwartet, aber die Tabelle sich ändert
  • Netzwerkleistung:Die Verwendung von SELECT * bei der Rückgabe von Ergebnissen an eine Client-Anwendung bedeutet, dass alle Spalten an den Client zurückgegeben werden; Wenn nur einige dieser Spalten vom Client verwendet werden, wird Bandbreite verschwendet und die Anwendung läuft langsamer, als sie könnte.
  • Indexierung / Leistung von Abfrageplänen:Wenn Sie eine Abfrage haben, die wirklich nur die Spalten zurückgeben muss, die an einem Index beteiligt sind, Sie aber stattdessen alle zurückgeben, können Sie unter Umständen viel schlechtere Abfragepläne erhalten, die von erstellt wurden Motor.

Ich bin mir nicht sicher, was Sie mit "Auswirkungen auf die Wildcard-Interpretation" meinen, aber ich vermute, Sie missverstehen, warum SELECT * eine schlechte Idee ist - die SQL-Engine validiert die bereitgestellten Spalten trotzdem; Die Kosten für das "Erweitern" des Platzhalters betragen im Wesentlichen 0.

Eine gespeicherte Prozedur ist nicht wirklich eine "kompilierte Codeeinheit":Der Abfrageplan für eine gespeicherte Prozedur wird normalerweise zwischengespeichert, nachdem sie zum ersten Mal ausgeführt wurde, aber das Gleiche gilt tatsächlich auch für Ad-hoc-SQL-Anweisungen in vielen/den meisten Fällen.

Nun, um Ihre Frage tatsächlich zu beantworten:Ja , alle Nachteile der Verwendung von SELECT * in Ad-hoc-SQL gelten gleichermaßen auch für SQL innerhalb einer gespeicherten Prozedur.