2017-05-15 1 views
3

Ich versuche, Daten aus einer ziemlich großen Tabelle, ca. 98 Millionen Zeilen, mit Datetime-Spalten in der WHERE-Klausel abzufragen. Es dauert ungefähr 12 Minuten, um abzuschließen - was natürlich nicht akzeptabel ist. Die Abfrage ist einfach:Abfrage auf große Tabelle mit DateTime WHERE-Klausel

SELECT ID, DateTime1, DateTime2, Value1, Value2 
FROM dataTable 
WHERE DateTime1 >= '2017-05-15 09:00' AND 
     DateTime1 <= '2017-05-15 09:30' 

Die Tabelle hat die folgende Struktur:

Column Name | DataType 
------------------------- 
ID   | float 
DateTime1 | datetime 
DateTime2 | datetime 
Value1  | float 
Value2  | varchar(20) 

Die Tabelle hat die folgenden Index:

Nonclustered: DateTime1, DateTime2, ID, Value2 
+0

Markieren Sie Ihre Frage mit der von Ihnen verwendeten Datenbank. Sie sollten auch 'Value1' in den Index einfügen. –

Antwort

1

In SQL Server:

Ihr Index deckt Value1 nicht ab, daher muss diese Spalte für jede Zeile aus der Tabelle abgerufen werden Es verwendet Ihren vorhandenen Index.

Sie könnten einen abdeckenden Index erstellen (enthält alle Spalten von der Abfrage erforderlich) wie folgt:

create nonclustered index ix_dataTable_DateTime1_cover 
    on dbo.dataTable (DateTime1) 
    include (Id, DateTime2, Value1, Value2); 

oder ändern Sie Ihre vorhandenen Index Value1 aufzunehmen.

Überprüfen Sie auch den Ausführungsplan. Teilen Sie Ihre Ausführungspläne mit Paste The Plan @ brentozar.com hier mit den Anweisungen: How to Use Paste the Plan.

+0

Danke, ich werde versuchen, den Index zu ändern/einen neuen hinzuzufügen, und ich melde mich bei Ihnen. –

0

Sie haben nur DateTime1 in Ihrem wo, also machen Sie einen Index nur für diese Spalte. Ein komplexer Index ist wie das Zusammensetzen eines Strings aus allen Teilen wie DateTime1 + DateTime2 + ID + Value2. Oh ja, das muss langsam sein.

Verwandte Themen