2016-05-26 10 views
3

Ich habe mich auf ein Interview vorbereitet und komme einfach zu diesen Dingen.Warum Sortierung von Datensätzen in Tabelle ist nicht wie Clustered-Index?

Ich habe ausgeführt folgende Aussagen:

create table trial 
(
    Id int not null, 
    Name varchar(10) 
) 

alter table trial add constraint unq unique clustered (Name) 

alter table trial add constraint pk primary key nonclustered(Id) 

insert into trial values (1,'a'),(3,'d'),(5,'b'),(2,'c') 

select * from trial 

Ergebnis ist wie hier gezeigt:

enter image description here

Meine Frage ist: Warum Ergebnis nicht nach Name Spalte sortiert wird als Namensspalte gruppierten hat Index?

Ergebnis ist:

1 a 
2 c 
3 d 
5 b 

Wie Index für physikalische Sortierung der Tabelle zu benutzen?

+0

Markieren Sie die verwendeten DBMS. (Indizes sind immer mehr oder weniger produktspezifisch.) – jarlh

+0

MS sql 2014 Entwickler Edition – Sagar

+0

Lesen Sie diesen Artikel zum Thema. https://blogs.msdn.microsoft.com/conor_cunningham_msft/2008/08/27/no-seatbelt-expecting-order-without-order-by/ –

Antwort

2

In diesem Fall bin ich mir sicher, dass der Optimizer entschieden hat, einen vollständigen Tabellenscan oder Nonclustered-Index-Scan durchzuführen, da er sehr klein ist. Sie können die tatsächlichen Ausführungsplan enthalten und sehen:

enter image description here

Sie können gruppierten Index erzwingen zu verwenden:

SELECT * FROM TRIAL WITH (INDEX(UNQ)) 

Und Sie wahrscheinlich erhalten wird:

enter image description here

und Ergebnismenge:

Id Name 
1 a 
5 b 
2 c 
3 d 

Aber Sie sollten das nicht wirklich tun, da die Bestellung immer noch nicht garantiert ist. Wenn Sie möchten, dass Ihre Ergebnisse nach Spalten sortiert werden, tun Sie dies explizit!

Ich werde ein Fragment aus dem Buch kopieren Exam 70-461: Querying Microsoft SQL Server 2012, wo man einige gute Erklärung bekommen:

Es ist wie die Ausgabe von empid sortiert erscheinen mag, aber das ist nicht garantiert. Was verwirrender sein könnte ist, dass wenn Sie die Abfrage wiederholt ausführen, scheint es, als ob das Ergebnis in der gleichen Reihenfolge zurückgegeben wird; aber auch das ist nicht garantiert. Wenn das Datenbankmodul (in diesem Fall SQL Server ) diese Abfrage verarbeitet, weiß es, dass es die Daten in beliebiger Reihenfolge zurückgeben kann, da keine explizite Anweisung an die Daten in einer bestimmten Reihenfolge zurückgibt.Es könnte sein, dass aufgrund von Optimierung und anderen Gründen die SQL Server-Datenbank-Engine auswählt, um die Daten in einer bestimmten Weise dieses Mal zu verarbeiten. Es gibt sogar einige Wahrscheinlichkeit, dass solche Entscheidungen wiederholt werden, wenn die physikalischen Umstände gleich bleiben. Aber es gibt einen großen Unterschied zwischen , was wahrscheinlich aufgrund von Optimierung und anderen Gründen passieren wird und was tatsächlich garantiert ist.

Die Datenbank-Engine kann - und manchmal auch - die Auswahl ändern, die sich auf die Reihenfolge auswirken kann, in der die Zeilen zurückgegeben werden, in dem Wissen, dass es dazu frei ist. Beispiele für solche Änderungen in Auswahlmöglichkeiten sind Änderungen in der Datenverteilung, Verfügbarkeit von physischen Strukturen wie Indizes und Verfügbarkeit von Ressourcen wie CPUs und Speicher. Auch bei Änderungen in der Engine nach einem Upgrade auf eine neuere Version des Produkts oder sogar nach Anwendung eines Service Packs können sich die Optimierungsaspekte ändern. Solche Änderungen können wiederum unter anderem die Reihenfolge der Zeilen im Ergebnis beeinflussen.

Kurz gesagt, dies kann nicht genug betont werden: Eine Abfrage, die nicht tut eine explizite Anweisung hat die Zeilen in einer bestimmten Reihenfolge zurückzukehren nicht die Reihenfolge der Zeilen in dem Ergebnis garantiert . Wenn Sie eine solche Garantie benötigen, ist die einzige Möglichkeit, es bereitzustellen, indem Sie der Abfrage eine ORDER BY -Klausel hinzufügen, und das ist der Fokus des nächsten Abschnitts.

EDIT basierend auf Kommentare:

Die Sache ist, dass selbst wenn Sie Clustered-Index verwenden, es ungeordnete Menge zurückkehren. Angenommen, Sie haben eine geordnete Reihenfolge der Clusterschlüssel wie (1, 2, 3, 4, 5). Die meiste Zeit werden Sie (1, 2, 3, 4, 5) erhalten, aber es kann Situationen geben, in denen sich der Optimierer dazu entschließt, parallel zu lesen und sagen, es hat 2 parallele Lesevorgänge und es liest (1, 2, 3) und (4, 5). Nun kann es vorkommen, dass (4, 5) zuerst zurückgegeben wird und dann (1, 2, 3) zurückgegeben werden kann. Wenn Sie keine order by Klausel-Engine haben, werden ihre Ressourcen nicht damit verbracht, diesen Satz zu bestellen, und Sie erhalten (4, 5, 1, 2, 3). Das erklärt, warum Sie immer sicherstellen sollten, dass Sie order by Klausel haben, wenn Sie bestellen möchten.

+0

Danke .. für diese Klarstellung. Eigentlich wusste ich, dass die physische Reihenfolge der Datensätze in der Tabelle immer dem Clustered Index entspricht. .. Aber ich habe mich geirrt ... – Sagar

+0

@Sagar, nein du warst richtig darin. Ich werde in der Antwort ausführlicher erklären. –

+0

danke .. Ich bin wirklich zufrieden mit dieser Antwort. Parallele Lesevorgänge ... korrekt. – Sagar

4

Wiederholen: SQL-Tabellen repräsentieren ungeordnete Sets. SQL-Ergebnismengen sind ungeordnet, es sei denn, die Abfrage enthält eine order by Klausel.

Also, wenn Sie Daten, um möchten, dann verwenden Sie ein order by:

select t.* 
from trial t 
order by t.name; 

Wenn Sie die Ergebnisse in einer bestimmten Reihenfolge möchten, order by verwenden. SQL Server hat einen guten Optimierer. Wenn es einen Index für die Abfrage verwenden kann - um eine tatsächliche Sortierung zu vermeiden - wird normalerweise der Index verwendet.

+0

ja, dass ich weiß .. warum Datensätze in der Tabelle nicht nach sortiert sind Clustered-Index? – Sagar

+0

Sorry, Sie haben keine Möglichkeit zu wissen, wie Datensätze in der Tabelle sortiert sind. Sie können nur sehen, wie Datensätze an Sie zurückgegeben werden, wenn Sie sie abfragen - und das ist rein SQL intern unbestimmte Sache, es sei denn, Sie fordern angegebene Reihenfolge an. – Arvo

+0

@Sager. . . Das Problem besteht nicht darin, wie Tabellen sortiert werden. Das Problem ist, wie die Abfrage funktioniert. Wenn Sie einen Daten-Dump der Seiten erstellt haben, würden Sie wahrscheinlich feststellen, dass die Daten tatsächlich auf den Datenseiten angeordnet sind. Die Abfrage muss dies jedoch nicht beachten. –

Verwandte Themen