Um die Geschwindigkeit eines SQL-Befehls zu erhöhen, sollten Sie über eine ordnungsgemäß eingerichtete Datenbank verfügen. Daher hoffe ich, dass Ihre Datenbank auf einer anderen Festplatte gespeichert ist und sich Master und Tempdb auf einer eigenen Festplatte befinden.
Davon abgesehen gibt es mehrere Faktoren, die die Indexerstellung beeinflussen: Wenn die Tabelle bereits sortiert ist und es so aussieht, als würden Sie diese auf einer HEAP-Tabelle aufbauen, würde ich sagen, dass sie nicht sortiert ist, und die andere Komponente ist der Spaltentyp, nach dem Sie arbeiten erstellen den Index auf. Die in einem Clustered-Index enthaltenen Informationen sind durch die Anzahl der Spalten oder die Bytegröße der Spalten (je nachdem, was zuerst eintritt) begrenzt. Daher sind einige Spalten keine so guten Kandidaten für Clustered-Indizes.
Da Sie einen eindeutigen Index für eine Heap-Tabelle erstellen, sollten Sie diese bereinigen, damit Sie keine doppelten Werte haben. Dadurch müssen Sie den Index nicht erneut erstellen.
Bevor Sie die Indexerstellungsabfrage ausführen, führen Sie diese zuerst aus
SELECT
barKey
FROM
(
SELECT
barKey,
COUNT(barKey) AS NoOfDuplicates
FROM
dbo.tblFactFoo WITH(NOLOCK)
GROUP BY
barKey
)
WHERE
NoOfDuplicates > 1;
Nachdem Sie dies ausgeführt und die doppelten Datensätze verarbeitet haben, können Sie Folgendes ausführen. Beachten Sie, dass hierfür zusätzlicher Speicherplatz benötigt wird, sodass Sie mindestens so viel Speicherplatz benötigen wie die Größe dieser Tabelle.
CREATE UNIQUE CLUSTERED INDEX IXC_MyTable ON dbo.tblFactFoo(barKey) WITH(SORT_IN_TEMPDB)
GO
Dadurch wird die Sortierung (die beim Erstellen eines Index erforderlich ist) in der Tempdb-Datenbank erzwungen und anschließend zurück übertragen und Ihre Daten ersetzt.
Eine Alternative wäre, eine doppelte Tabelle mit demselben Namen, denselben Spalten usw. zu erstellen, den Clusterschlüssel hinzuzufügen, bevor Sie Datensätze hinzufügen und dann diesen Befehl ausführen:
MERGE INTO dbo.tblFactFoo AS source
USING dbo.tblFactFooIndexed AS destination ON source.barKey = destination.barKey
WHEN NOT MATCHED BY source THEN
INSERT INTO destination(col1, col2, barKey etc) VALUES (source.col1, source.col2, source.barKey etc)
WHEN MATCHED BY source AND (add extra conditions here if needed) THEN
-- INSERT / UPDATE or DELETE depending on how you want to handle duplicate keys
Da es sich um eine Set-Operation handelt, sollte dies theoretisch viel schneller funktionieren, da der SQL Server mit Sets schneller arbeitet als mit Zeilen. Wenn Sie fertig sind, löschen Sie die erste Tabelle und benennen Sie die zweite Tabelle um.
Sollten Sie weitere Hilfe mit dem Befehl MERGE benötigen, finden Sie hier den Link zu MSDN: http://msdn.microsoft.com/en-us/library/bb510625.aspx