Ich wäre für Hilfe dankbar, wenn ich erfahren würde, wie ich ohne Code nicht gruppierte Indizes auf einer SQL Server 2008-Datenbank erstellen kann – oder besser gesagt, ein für alle Mal „statisch“, bevor SQL-Abfragen ausgeführt werden (das macht wahrscheinlich keinen Sinn, aber ich möchte nicht jedes Mal, wenn ich meine SQL-Abfragen ausführe, die Teil meiner Geschäftsanwendung sind, den SQL-Befehl zum Erstellen von Indizes ausführen).
Das heißt, idealerweise gibt es ein Tool innerhalb von Microsoft SQL Server, das in Visual Studio 2010 Professional integriert ist (HINWEIS: ICH HABE KEINE ENTERPRISE- ODER ULTIMATE-EDITIONEN – DAS MACHT EINEN GROßEN UNTERSCHIED DARIN, WAS ICH MIT DEM INTEGRIERTEN SQL MANAGER IN DER PROFESSIONAL-VERSION TUN KANN), um dies zu tun – da ich kein anderes Tool habe (ich habe gerade nachgeschaut und festgestellt, dass Microsoft SQL Server 2008 nicht das hat, was ich brauche – zumindest nicht auf meinem System – es ist anscheinend eine verkrüppelte Freeware-Version). Vielleicht ist also ein einfacher SQL-Befehl zum Indizieren der folgenden Tabelle gerechtfertigt.
Ich habe die unten stehenden Referenzen gelesen, kann aber nicht herausfinden, wie das geht.
Hier ist meine Tabelle:
Table CUSTOMER
Columns:
CustomerID = GUID - this is a unique primary key
CustomerDecimal1 = decimal- this is not unique, but 99% of the time it is unique
compared to the rest of decimal fields. I wish to index this field 1 of 2
CustomerDecimal2 = decimal- this is not unique, but 99% of the time it is unique
compared to the rest of decimal fields. I wish to index this field 2 of 2
CustomerTextComments = vChar(50)
Die Dezimalfelder werden häufig in WHERE-Klauseln verwendet und sind daher ideale Kandidaten für einen nicht gruppierten Index, bei dem es sich offenbar um eine neue Funktion handelt, die in Microsoft SQL Server 2008 unterstützt wird.
Weiteres zu meiner Plattform: Ich habe bereits eine Tabelle mit vorhandenen Daten, aber nur wenige Datensätze, die meisten davon leer. Ich arbeite mit dem Server Explorer in Visual Studio 2010, das viele Funktionen bietet, darunter die Möglichkeit, SQL-Abfragen zu generieren. Idealerweise würde ich gerne eine Indizierungsmethode in Linq-to-entities schreiben (nur weil ich SQL nicht so gut kenne), aber wenn mir jemand eine vollständige Liste geben könnte, wie die Felder CustomerDecimal1 und CustomerDecimal2 in dieser Tabelle indiziert werden, wäre ich dankbar.
Verweise:
http://blog.sqlauthority.com/2008/09/01/sql-server-2008-introduction-to-filtered-index-improve-performance-with-filtered-index/ (SQL Server 2008, neue „gefilterte“ Indexeigenschaft für WHERE-Klauselsuchen)
http://en.wikipedia.org/wiki/Index_%28database%29#Non-clustered
-----Aktualisiert
@mrdenny – ich danke Ihnen für Ihre Zeit und sehe, dass Sie einen hervorragenden Ruf haben, aber ich kann nicht glauben, was Sie sagen – ja, ich bin stur und nenne es Verleugnung! :-) Ich werde diesen Thread noch ein bisschen offen lassen, in der Hoffnung, dass ihn jemand anderes sieht. Da ich außerdem kein natives SQL ausführe, sondern nur Linq-to-entities innerhalb des Entity Frameworks (EF 4.0), wüsste ich nicht einmal, wo ich den Code einfügen sollte, den Sie hilfreicherweise bereitgestellt haben („T/SQL zum Erstellen eines nicht gruppierten Indexes für die beiden Dezimalspalten“). Ich verwende bei meiner WHERE-Suche immer beide Dezimalspalten – daher ist Ihr erster SQL-Befehl für mich angemessen.
Kann irgendjemand Mr. Dennys ersten SQL-Code in Linq-to-Entities übersetzen? Wenn das nicht klappt, werde ich die Hände heben und sagen, dass ich das nicht glaube (das widerspricht dem, was ich darüber gelesen habe, dass Indizierung wie eine Art ausgeglichener Baum ist, der automatisch in das System eingebaut werden sollte), oder alternativ habe ich zwischen den Zeilen gelesen, dass Indizierung Ihnen höchstens 20 % mehr Leistung bringt – gut, aber nichts, worüber man sich wirklich aufregen sollte. Ja, das ist Neid!
Antwort1
Erstens sind nicht gruppierte Indizes in SQL Server 2008 nichts Neues. Es gibt sie schon immer. Gefilterte Indizes sind in SQL Server 2008 neu.
Es gibt keine Möglichkeit, das System ermitteln zu lassen, welche Indizes erstellt werden müssen, bevor Abfragen an den SQL Server ausgeführt werden.
Es gibt zwei Möglichkeiten, Indizes in SQL Server zu erstellen. Eine davon ist mit T/SQL, die andere mit SQL Server Management Studio, das über einen grafischen Editor verfügt. Der grafische Editor generiert einfach T/SQL und führt T/SQL für die Datenbank aus.
Das T/SQL zum Erstellen eines nicht gruppierten Indexes für die beiden Dezimalspalten würde ungefähr wie unten aussehen.
CREATE INDEX IX_CustomerDecimal1_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal1, CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
Nicht, wenn Sie die beiden CustomerDecimal-Felder beim Durchsuchen der Datenbanktabelle unabhängig voneinander verwenden möchten. In diesem Fall benötigen Sie für jedes einen separaten Index.
CREATE INDEX IX_CustomerDecimal1 on dbo.CUSTOMER
(CustomerDecimal1)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
CREATE INDEX IX_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
In beiden Fällen müssen Sie die Spalten, die Sie zurückgeben, zur Liste der eingeschlossenen Spalten hinzufügen, um die generierte E/A zu minimieren.