2009-04-08 12 views

Antwort

1

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.

1

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.

6

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.

3

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.
2

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.

2

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 :)

Verwandte Themen