2016-10-20 3 views
0

Erstellt zwei Tabellen Primärschlüssel CLUSTERED mit Identität und Datum ON-Partition, da eine Aufgabe Splits und Partitionen kürzen älter als 30 Tage. nur die jüngsten Aufzeichnungen aufbewahren.Beziehungen und Verbindungen zwischen Tabellen mit Primärschlüsseln gruppierten Index

Ich habe ein spezielles Feld, um die Tabellen zu korrelieren, aber die verbindet sind schmerzhaft langsam sogar mit Indizes. Können Sie vorschlagen, wie Sie optimieren können?

die Tabellen Next und die Join-Anweisung:

CREATE TABLE [dbo].[Redeem](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Ticket] [nvarchar](64) NOT NULL, 
    [CorrelationTicket] [nvarchar](64) NOT NULL, 
    [CreatedUTC] [datetime] NOT NULL, 
    [CreatedDate] [date] NOT NULL, 
    [Redeem fields here...] 
CONSTRAINT [PK_Redeem] PRIMARY KEY CLUSTERED 
(
    [CreatedDate] ASC, 
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 
ON myPS([CreatedDate]); 

CREATE NONCLUSTERED INDEX [IX_Redeem_CorrelationTicket] 
ON [dbo].[Redeem]([CreatedDate] ASC, [CorrelationTicket] ASC) 
ON [myPS] ([CreatedDate]); 

CREATE TABLE [dbo].[Validate](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Ticket] [nvarchar](64) NOT NULL, 
    [CorrelationTicket] [nvarchar](64) NOT NULL, 
    [CreatedUTC] [datetime] NOT NULL, 
    [CreatedDate] [date] NOT NULL, 
    [Validate fields here...] 
CONSTRAINT [PK_Validate] PRIMARY KEY CLUSTERED 
(
    [CreatedDate] ASC, 
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 
ON myPS([CreatedDate]); 

CREATE NONCLUSTERED INDEX [IX_Validate_CorrelationTicket] 
ON [dbo].[Validate]([CreatedDate] ASC, [CorrelationTicket] ASC) 
ON [myPS] ([CreatedDate]); 

Und dies ist der Join:

SELECT top 100 
    v.*, 
    r.* 
from 
    Validate v 
LEFT OUTER join Redeem r 
    on v.CorrelationTicket = r.CorrelationTicket 
ORDER BY v.CreatedDate DESC 
+1

Markieren Sie die verwendeten dbms (vielleicht SQL Server?), Um besser und richtiger Aufmerksamkeit zu bekommen. (Viele nicht-ANSI SQL dort ...) – jarlh

+0

Warum ist Ihr Index auf beiden Spalten? ID ist bereits einzigartig, ich würde denken, dass Ihre Abfrage würde mehr von einem Index profitieren *** nur *** auf "CorrelationTicket" anstatt sowohl "CorrelationTicket" und "CreatedDate" Beachten Sie auch, Sie tun eine 'Order by' Bedeutung Um die Top 100 zu erhalten, muss zuerst der gesamte Ergebnissatz bestellt werden. Auch aus welchem ​​Grund verbindest du dich innerlich? Sie brauchen einfach alles von validieren? Ich glaube, im Allgemeinen 'innere' Join ist schneller als nicht – Kritner

+0

Veröffentlichen Sie den Abfrageplan. – RBarryYoung

Antwort

0

Sie Krintner Dank!

Das Problem war die ORDER BY, wie Sie vorgeschlagen. Es war das Sortieren der gesamten Ergebnismenge (nicht sicher warum). Ich muss sortieren, aber den Index ändern, um DESC zu sein, hat den Trick gemacht.

Ich folgen auch der Empfehlung und verwenden nur CorrelationTicket im INDEX.

CONSTRAINT [PK_Redeem] PRIMARY KEY CLUSTERED 
(
    [CreatedDate] DESC, 
    [Id] DESC 
) 
Verwandte Themen