Ich Frage Tabelle, um letzte n Datensätze auswählen, aber die Reihenfolge beibehalten. Dazu verwende ich die folgende Abfrage, die ich von Select Top N Records Ordered by X, But Have Results in Reverse Order bekam:Leistung in Bezug auf die Auswahl der letzten n Datensätze aus einer Tabelle
WITH Temp
AS (SELECT TOP 10
[TestID] ,
UserID ,
DateSent
FROM [Test]
WHERE UserID = @UserID
ORDER BY DateSent DESC
)
SELECT *
FROM Temp
ORDER BY DateSent
d.h ich die letzten n Datensätze bin Auswahl, während die Sortierreihenfolge zu erhalten. Im Folgenden finden Sie die Dummy-Skripte, um die obigen Tabellen zu erstellen:
GO
CREATE TABLE [dbo].[Test]
(
[TestID] [int] IDENTITY(1, 1)
NOT NULL ,
[UserID] [int] NOT NULL ,
[DateSent] [datetime] NOT NULL ,
CONSTRAINT [PK_TestID] PRIMARY KEY CLUSTERED ([TestID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_Test_UserID_DateSent] ON [dbo].[Test]
(
[UserID] ASC,
DateSent DESC
)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]
GO
GO
INSERT INTO [Test]
SELECT TOP 100000 ABS(CAST(NEWID() AS BINARY(6)) %10),
DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1 - FLOOR(RAND(CAST(NEWID() AS binary(4))) * 365.25 * 90), 0)
FROM master..spt_values
GO
Above ich die Tabelle erstellt haben, Index auf sie angewendet und eingefügt in sie einige Dummy-Daten. Ich Ausführung dieser Abfrage die Datensätze zu erhalten:
DECLARE @UserID INT
SET @UserID = 1 ;
WITH Temp
AS (SELECT TOP 10
[TestID] ,
UserID ,
DateSent
FROM [Test]
WHERE UserID = @UserID
ORDER BY DateSent DESC
)
SELECT *
FROM Temp
ORDER BY DateSent
Unten ist der Ausführungsplan nach der obigen Abfrage ausgeführt wird:
Wie Sie der Index folgende sehen können, aber für innere Abfrage und Sie können im Indexplan sehen, dass 77% der Ausführung vom Sortierprozess übernommen werden. Wie kann ich das vermeiden? Welchen Index soll ich hier anwenden, um diese Situation zu überwinden?
Ja, tatsächlich. Aber kann ich meine Abfrage ändern oder einen anderen Index erstellen, um den Index auch für diese 10 Datensätze anzuwenden? –
Siehe meine Antwort, die diese Frage adressieren. – Yuck