2012-04-13 3 views
1

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:

enter image description here

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?

+0

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? –

+0

Siehe meine Antwort, die diese Frage adressieren. – Yuck

Antwort

5

Die letzte Sorte, die 77% des Ausführungsplans verbraucht, funktioniert nur mit Ihren TOP 10 Datensätzen. Sie können dies überprüfen, indem die endgültige ORDER BY Entfernung:

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 

Es sollte erwähnt werden, dass alle Betreiber in einem Plan zu 100% addieren müssen. Wenn Ihre billigste Operation (d. H. Das Sortieren von nur 10 Datensätzen) den größten Teil der Ausführungszeit beansprucht, dann würde ich sagen, dass Sie in guter Verfassung sind.

enter image description here

+0

Ich dachte daran, diesen Sort Operator auch zu überwinden, um vielleicht auch einen Index für diesen Operator zu verwenden? –

+0

@RockySingh Der Punkt ist, dass Sie nicht alle Operationen auf 0% reduzieren können. Die Arbeit muss irgendwo gemacht werden. Da Ihre Sortierung auf einer materialisierten Tabelle (dem CTE) liegt, weiß ich nicht, dass ein Index jemals verwendet werden könnte. Trotzdem ist es nur für ** 10 Zeilen **. Wie viel wird die Ausführungszeit wirklich verbessern? – Yuck

+0

Eigentlich sind die Nubmer immer 100%. Es ist nicht "teuer" an sich, es ist "wie groß ein Teil der Zeit dort verbracht wurde". Wenn Sie die Indexsuche reduzieren - wo denken Sie, dass die 100% gehen - woanders. Es muss schnell genug sein UND die Zeit, in der es Zeit verbringt, muss Sinn ergeben. Hier tut es - Datenzugriff über Index. Aber die Zahlen enden IMMER als 100 - es ist relatives Gewicht, nicht absolut. – TomTom

Verwandte Themen