Frage

Ich habe diese Frage gegoogelt und kann nicht scheinen, eine einheitliche Meinung zu finden, oder viele Meinungen, die auf solide Daten basieren. Ich würde einfach gerne wissen, ob die Platzhalter in einer SQL-SELECT-Anweisung mit zusätzlichen Aufwand verursacht als jedes Element einzeln aufrufen aus. Ich habe die Ausführungspläne sowohl in verschiedenen Testanfragen verglichen, und es scheint, dass die Schätzungen immer das gleiche lesen. Ist es möglich, dass einige Overhead an anderer Stelle entstanden ist, oder sind sie wirklich gleich behandelt?

Was ich beziehe mich auf speziell:

SELECT *

vs.

SELECT item1, item2, etc.
War es hilfreich?

Lösung

SELECT * FROM...

und

SELECT every, column, list, ... FROM...

wird die gleiche ausgeführt werden, da beide sind nicht optimierten Scan

Der Unterschied ist:

  • die zusätzliche Suche in sys.columns zu lösen *
  • der Vertrag / Signatur ändern, wenn die Tabellenschemaänderungen
  • Unfähigkeit, einen abdeckenden Index zu erstellen. In der Tat, keine Tuning-Optionen überhaupt, wirklich
  • haben Ansichten aktualisieren benötigt, wenn nicht schemabound
  • kann nicht indizieren oder schemabind eine Ansicht mit *
  • ... und andere Sachen

Andere SO Fragen zum selben Thema ...

Andere Tipps

Sie meinen select * from ... statt select col1, col2, col3 from ...?

Ich denke, es ist immer besser, die Spalte zu nennen und die minimale Menge an Informationen abgerufen werden, da

  • Ihr Code wird in der DB unabhängig von der physikalischen Reihenfolge der Spalten arbeiten. Die Spaltenreihenfolge sollte Ihre Anwendung nicht beeinflussen, aber es wird der Fall sein, wenn Sie * verwenden. Es kann bei db Migration gefährlich sein, etc.
  • Wenn Sie die Spalten benennen, kann das DBMS weiteren Optimierung der Ausführung. Zum Beispiel, wenn ein Index ist, die alle Daten enthält, Ihr interessiert sind, wird die Tabelle nicht zugegriffen werden.

Wenn Sie etwas anderes mit „Wildcard“ bedeutet, nur meine Antwort ignorieren ...

EDIT: Wenn Sie über die Sternchen wie in Select * From ... Wild Card im Gespräch sind dann andere Antworten sehen ...

Wenn Sie über Platzhalter in Prädikat Klauseln sprechen oder anderen Abfrageausdrücke wie Operator, (_ , % ) wie unten beschrieben, dann:

Dies hat damit zu tun, ob wirkt sich auf die Wildcard verwenden, ob die SQL „SARG-ABLE“ ist oder nicht. Sargable, (Search-argument-fähig) bedeutet, ob oder ob nicht die Suche der Abfrage oder Argumente sortieren kann als Eingabeparameter zu einem bestehenden Index verwendet werden. Wenn Sie die Wild Card an den Anfang eines Arguments voranstellen

 Where Name Like '%ing'

Dann gibt es keine Möglichkeit, einen Index für das Namensfeld zu durchqueren, die Knoten zu finden, dass Ende in 'ing'.

Wenn OTOH Sie das Wildcard an das Ende anhängen,

Where Name like 'Donald%' 

dann kann das Optimierungsprogramm noch einen Index für die Namensspalte verwenden, und die Abfrage ist noch SARG-able

Wenn Sie die SQL wildes Auto nennen, ist *. Dabei spielt es keine Performance-Overhead durch sich selbst bedeuten. Wenn jedoch die Tabelle erweitert wird, könnte man sich die Beschaffung von Feldern finden Sie nicht suchen. Im Allgemeinen ist nicht spezifisch in den Feldern, die Sie suchen oder Insert ist eine schlechte Gewohnheit. Betrachten

insert into mytable values(1,2)

Was passiert, wenn die Tabelle in drei Felder erweitert wird?

Es kann nicht mehr Arbeit von einem Ausführungsplan Standpunkt sein. Aber wenn Sie holen Spalten, die Sie nicht wirklich brauchen, ist, dass zusätzliche Netzwerkbandbreite zwischen der Datenbank und der Anwendung verwendet werden. Auch wenn Sie ein High-Level-Client-API verwenden, das einige Arbeit auf die zurückgegebenen Daten durchführt (zum Beispiel Perl selectall_hashref) dann diese zusätzlichen Spalten Leistungskosten auf der Client-Seite aufzuzwingen. Wie viel? Kommt drauf an.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top