2009-03-06 18 views
2

erstellen Ich habe die folgende sehr große Tabelle in SQL Server 2005:Wie man richtig einen Index

create table Blah 
(
    FirstName varchar(30), 
    Rank int, 
    Position int, 
    ... 
) 

Ich werde die folgende Abfrage darauf laufen:

declare @PassedInFirstName varchar(30) 
set @PassedInFirstName = 'SomeName' 

select TOP 1 Position 
from Blah 
where FirstName = @PassedInFirstName 
order by Rank DESC 

ich folgendes bin Einrichtung Index darauf:

CREATE INDEX IX_Blah ON Blah (FirstName, Rank) 

Da ich es von Rang DESC bestellen, soll ich ändere den Index Rang in absteigender Weise zu bestellen:

CREATE INDEX IX_Blah ON Blah (FirstName ASC, Rank DESC) 

Oder ist es egal?

Danke.

Antwort

3

Wenn, wenn die WHERE Renditen profitieren sollten viele Reihen.

Ich habe Ergebnisse gesehen, wo logischer IO um 50% in dem Index um mit DESC reduziert wurde von

auch um einen Auftrag zu entsprechen, ändern Sie die Abfrage zur Deckung:

SQL 2005 +:

CREATE INDEX IX_Blah ON Blah (FirstName, Rank DESC) INCLUDE (Position) 

SQL 2000, SQL 7:

CREATE INDEX IX_Blah ON Blah (FirstName, Rank DESC, Position) 
+0

+1 für das Abdeckstück – AngryHacker

2

Das Hinzufügen von Rank als absteigender Wert in Ihrem Index ist nur eine geringfügige Änderung. Sql Server kann wahrscheinlich umgekehrte die Sortierung verwendet, oder in diesem Fall leicht auf das letzte Element in der Liste iterieren.

Positionieren Sie Ihren Primärschlüssel? Ein Index besteht aus einer indizierten Spalte, dem Primärschlüssel und optional eingeschlossenen Spalten. Wenn Position nicht Ihr Primärschlüssel ist, suchen Sie derzeit nach Ihrem Primärschlüssel in Ihrem Index und suchen dann mit dem Primärindex nach dem Positionswert. Fügen Sie den Position-Wert als eingeschlossene Spalte hinzu, und Sie sollten Ihre Abfrage nur auf einem einzigen Index ausführen können. Andere Indizes werden nicht verwendet.

CREATE INDEX IX_Blah ON Blah (FirstName, Rank DESC) INCLUDE (Position) 

Vergessen Sie nicht, Ihre Abfragepläne zu überprüfen, sie kann Ihnen sagen, wenn Sie irgendwelche Indizes fehlen (SQL Server 2008 unter der Annahme), welche Indizes verwendet werden, usw.

+0

Hier sind keine Primärschlüssel beteiligt, auch keine Spalten sind eindeutig. – AngryHacker

0

messed ich Authentifizierung auf meinem vorherigen p nach oben ost, das ist mein registrierter Benutzer.

Ein Index basiert auf den von Ihnen ausgewählten Spalten und dem Primärschlüssel. Sie speichern grundsätzlich eine Hashmap, wobei der Schlüssel (Vorname, Rang) in Ihre ID aufgelöst wird (vorausgesetzt, Ihr Primärschlüssel ist Id). Diese ID wird dann verwendet, um den Positionswert zu lesen.

Mein Vorschlag wäre, den Positionswert als eine eingeschlossene Spalte in den Index aufzunehmen. Dies würde es Ihnen ermöglichen, die Daten aus dem Index zu lesen und die zweite Suche zu vermeiden.

Verwandte Themen