2016-10-17 2 views
1

Wenn ich eine Tabelle mindestens zwei Spalten wie folgt enthält:Ist die Reihenfolge der Auswahlparameter wichtig?

[User] 
[FirstName]|[LastName] 
Robert-Dupont 
Louis-Dupont 
Georges-Andre 

Unter der Annahme, dass es eine riesige Menge an Daten, und dass es viel mehr einzigartiges Ergebnis in ‚Firstnamen‘ als in ‚Namen‘, die Abfrage ist der schnellste:

Abfrage 1:

SELECT * USER WHERE LastName = 'Dupont' AND FirstName = 'Robert' 

Abfrage 2:

SELECT * USER WHERE FirstName = 'Robert' AND LastName = 'Dupont' 

Gibt es einen Unterschied?

Danke für Ihre Hilfe!

+1

nein. überhaupt anders – Squirrel

+0

Die Reihenfolge der Auswertung ist weder garantiert noch respektiert (außer für die CASE-Ausdruck) – dean

Antwort

4

Die Reihenfolge der Vergleiche spielt keine Rolle. SQL Server sollte die WHERE-Klausel für die Daten optimieren. Wenn Sie jedoch Wert auf Leistung legen, sollten Sie den Index user(firstname, lastname) oder user(lastname, firstname) verwenden. Die Reihenfolge der Vergleiche ist nicht die richtige, an die man denken muss.

0

ein Index von unten stehende Formular

(firstname,lastname) 

in beiden Abfragen helfen kann ..

firstname='' and lastname='' 

oder

lastname='' and fastname='' 

so Ihre beide Abfragen sind schneller, aber wenn Sie ausstellen Abfrage von unten Formular, mit gleichem Index

firstname>='' and lastname='' 

Vorname verwendet Index und SQLServer kann nicht Index auf der zweiten Spalte verwenden, aber es nutzt Restnachschlagewerte, um herauszufiltern

0

Beide Abfrage gleich sind schneller. Weil die Where-Klausel Bedingungen enthält. Das ist nicht wichtig, einzigartige Spalten.

+0

Können Sie versuchen, diese Antwort zu klären. Ich kann nicht verstehen, was du sagen willst. –

+0

Die WHERE-Klausel wird verwendet, um nur die Datensätze zu extrahieren, die ein spezifiziertes Kriterium erfüllen. Es spielt also keine Rolle, dass Sie eine eindeutige Spalte haben. Zwei Bedingungen haben die gleiche Bedeutung. (Asked: _that es gibt viel mehr eindeutiges Ergebnis in 'FirstName' als in 'LastName_) – fable

0

es ist genau das gleiche, wenn beide auf dem gleichen Niveau sind. aber dies ist auf jeden Fall besser:

SELECT * 
    FROM (SELECT * 
      FROM USER 
     WHERE LastName = 'Dupont') 
WHERE FirstName = 'Robert' 

EDIT

Gehen wir zurück zu Relationale Algebra, es besser ist, keine Ergebnisse so weit unten den Baum wie möglich zu filtern. Angenommen, die Nachnamen sind seltener als die Vornamen, filtern Sie zuerst die "Duponts" und suchen Sie dann in der Ergebnismenge nach "Roberts".

+0

Können Sie erklären, wie das besser ist? Dies wird nichts anderes bewirken, als die Abfrage für Menschen schwieriger zu lesen. –

+1

@SeanLange - Ich habe meine Antwort bearbeitet, um die Logik zu erklären, aber ich stimme überhaupt nicht mit dir überein. Innere Abfragen sind nicht schwieriger zu lesen, wenn sie richtig formatiert sind. – Ted

+0

Aber in diesem Fall wird es keinen tatsächlichen Nutzen für die Leistung bieten. Es fügt mehr Zeichen hinzu und ist komplexer für das gleiche Ergebnis. Ich verstehe Ihre Logik, aber in SQL Server wird der Ausführungsplan genau das gleiche sein. –

Verwandte Themen