Ich habe eine Abfrage, die derzeit durchschnittlich 2500 ms in Anspruch nimmt. Mein Tisch ist sehr eng, aber es gibt 44 Millionen Zeilen. Welche Möglichkeiten habe ich, um die Leistung zu verbessern, oder ist dies so gut wie es nur geht?
Die Abfrage
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
Der Tisch
CREATE TABLE [dbo].[Heartbeats](
[ID] [int] IDENTITY(1,1) NOT NULL,
[DeviceID] [int] NOT NULL,
[IsPUp] [bit] NOT NULL,
[IsWebUp] [bit] NOT NULL,
[IsPingUp] [bit] NOT NULL,
[DateEntered] [datetime] NOT NULL,
CONSTRAINT [PK_Heartbeats] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Der Index
CREATE NONCLUSTERED INDEX [CommonQueryIndex] ON [dbo].[Heartbeats]
(
[DateEntered] ASC,
[DeviceID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Würde das Hinzufügen zusätzlicher Indizes helfen? Wenn ja, wie würden sie aussehen? Die aktuelle Leistung ist akzeptabel, da die Abfrage nur gelegentlich ausgeführt wird. Ich frage mich jedoch, ob ich etwas tun kann, um dies zu beschleunigen.
AKTUALISIEREN
Wenn ich die Abfrage ändere, um einen Force-Index-Hinweis zu verwenden, wird die Abfrage in 50 ms ausgeführt:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WITH(INDEX(CommonQueryIndex))
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
Das Hinzufügen einer richtig selektiven DeviceID-Klausel trifft auch den Bereich von 50 ms:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' AND DeviceID = 4;
Wenn ich ORDER BY [DateEntered], [DeviceID]
zur ursprünglichen Abfrage hinzufüge , bin ich im Bereich von 50 ms:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
ORDER BY [DateEntered], [DeviceID];
Diese verwenden alle den Index, den ich erwartet hatte (CommonQueryIndex). Ich nehme an, meine Frage lautet jetzt: Gibt es eine Möglichkeit, die Verwendung dieses Index für Abfragen wie diese zu erzwingen? Oder ist die Größe meines Tisches zu groß und ich muss nur einen ORDER BY
oder einen Hinweis verwenden?