2016-08-02 13 views
4

Nach einer Abfrage ausgeführt wird, die SQL Server 2014 Actual Query Plan zeigt einen fehlenden Index wie folgt:SQL Server 2014-Indexoptimierung: Jeder Vorteil mit Primärschlüssel in Indizes?

CREATE NONCLUSTERED INDEX IX_1 ON Table1 (Column1) INCLUDE 
(PK_Column,SomeOtherColumn) 

Der fehlende Index schlägt die Primärschlüsselspalte in den Index aufzunehmen. Die Tabelle ist Clustered-Index mit der PK_Column.

Ich bin verwirrt und es scheint, dass ich das Konzept des Clustered Index Primärschlüssel nicht richtig bekomme.

Meine Annahme war: Wenn eine Tabelle eine gruppierte PK hat, zeigen alle nicht geclusterten Indizes auf den PK-Wert. Hab ich recht? Wenn ich der Grund bin, warum der fehlende Index des Abfrageplans mich auffordert, die PK-Spalte in den Index aufzunehmen?

+1

Ich denke, der Vorschlag ist überflüssig (in der Regel erfordern die fehlenden Indexvorschläge eine genaue Überprüfung, um zu sehen, welche wirklich eine gute Idee sind, weil der Optimierer alles vorschlagen und die Küche sinken wird). Sie könnten versuchen, den Index nur mit "INCLUDE (SomeOtherColumn)" zu erstellen und sehen, ob die Abfrage ihn verwendet und der Hinweis verschwindet, was eine ziemlich solide Bestätigung wäre. –

+0

Können Sie den Abfrageplan und das Schema der beteiligten Tabellen anzeigen? – TheGameiswar

+0

Ihr Verständnis ist richtig - die * Blattebene * eines beliebigen Nonclustered-Index enthält die Spalten dieses Indexes, alle * enthaltenen * Spalten, ** und ** die Clustering-Schlüsselspalte (s).Das Problem ist wirklich der Tuning-Berater: Es ist eine Software, von der man weiß, dass sie eher unnötig ist, etwas völlig überflüssiges. Benutze diese Empfehlungen nicht blind! –

Antwort

1

Zusammenfassung:
Index empfohlen ist nicht gültig, aber es macht keine difference.See unten Tests für Details ..

seit einiger Zeit Nach der Untersuchung, fand eine answer here und unter Anweisung erklärt überzeugend über fehlende Index-Funktion ..

sie nur eine einzelne Abfrage oder eine einzelne Operation innerhalb einer einzigen Abfrage betrachten. Sie berücksichtigen nicht, was bereits existiert oder Ihre anderen Suchmuster.

Sie brauchen immer noch einen denkenden Menschen, der die gesamte Indexierungsstrategie analysiert und sicherstellt, dass Ihre Indexstruktur effizient und zusammenhängend ist.

Also kommt zu Ihrer Frage, dieser Index kann gültig sein, sollte aber nicht als selbstverständlich angesehen werden. Der empfohlene Index ist nützlich für SQL Server für die bestimmte Abfrage ausgeführt, um Kosten zu reduzieren.

Dies ist der Index, der empfohlen wurde ..

CREATE NONCLUSTERED INDEX IX_1 ON Table1 (Column1) 
     INCLUDE (PK_Column, SomeOtherColumn) 

Angenommen, Sie eine Abfrage wie unten haben ..

select pk_column, someothercolumn 
from table 
where column1 = 'somevalue' 

SQL Server versucht, einen schmalen Index als auch, wenn vorhanden zu scannen, so In diesem Fall wird ein Index wie empfohlen hilfreich sein.

Weiter haben Sie das Schema der Tabelle nicht geteilt, wenn Sie einen Index wie unter

haben
create index nci_test on table(column1) 

und eine Abfrage von unten stehendem Formular wieder denselben Index beraten, wie in Frage angegeben

select pk_column, someothercolumn 
from table 
where column1 = 'somevalue' 

Update:
i Aufträge Tabelle mit folgendem Schema habe ..

[orderid] [int] NOT NULL Primary key, 
[custid] [char](11) NOT NULL, 
[empid] [int] NOT NULL, 
[shipperid] [varchar](5) NOT NULL, 
[orderdate] [date] NOT NULL, 
[filler] [char](160) NOT NULL 

Jetzt Ich habe einen weiteren Index der Struktur erstellt.

create index onlyempid on orderstest(empid) 

Jetzt, als ich habe eine Abfrage von unten stehenden Formular

select empid,orderid,orderdate --6.3 units 
from orderstest 
where empid=5 

Indexberater werden unter fehlendem Index beraten.

CREATE NONCLUSTERED INDEX empidalongwithorderiddate 
ON [dbo].[orderstest] ([empid]) 
INCLUDE ([orderid],[orderdate])--you can drop orderid too ,it doesnt make any difference 

Wenn Sie orderid sehen können auch in oben Vorschlag enthalten ist

lässt es jetzt schaffen und beide Strukturen beobachten ..

--- Root-Ebene -------

für Index onlyempid ..
enter image description here

für Index empidalongwithorderiddate enter image description here

---- Blattebene -------

Für Index onlyempid ..
enter image description here

für Index empidalongwithorderiddate
enter image description here

Wie Sie sehen können Das Erstellen nach Vorschlag macht keinen Unterschied, obwohl es ungültig ist.

Ich nehme Vorschlag von Index Advisor auf Abfrage basiert gemacht wurde lief und ist speziell für die Abfrage und es hat keine Ahnung von anderen Indizes

beteiligt
+0

Das Schema stimmt mit dem überein, was Sie in der Abfrage haben. Schlägst du vor, dass das IX_1 tatsächlich für die Frage gültig ist, die du hast? Basierend auf dem anderen Kommentar denke ich, dass PK_Column nicht enthalten sein sollte und Speicher-Overhead ohne irgendeinen Vorteil auferlegt. Sind Sie damit einverstanden? –

+0

ja für die Abfragetypen habe ich in meiner Antwort, Index vorgeschlagen sind gültig, aber nur für diese Abfrage – TheGameiswar

+0

ok, jetzt verstehe ich Ihre Antwort. Wie profitiert Ihre erste Abfrage von PK_Column? Der Index hat bereits die PK-Daten, warum müssen wir sie erneut hinzufügen? –

0

ich Ihr Schema nicht wissen, noch Ihre Fragen. Einfach raten.

Bitte korrigieren Sie mich, wenn diese Theorie falsch ist.

Sie haben Recht, dass nicht gruppierte Indizes auf den PK-Wert zeigen. Stellen Sie sich vor, Sie haben eine große Datenbank (z. B. Gigabyte an Dateien), die auf einer normalen Festplatten-Festplatte gespeichert ist. Nehmen wir an, dass die Festplatte fragmentiert ist und der PK_Index weit entfernt von Ihrem Table1 Index gespeichert ist.

Stellen Sie sich vor, dass Ihre Abfrage auch Spalte1 und PK_column auswerten muss. Die Abfrage Ausführung gelesen Spalte1 Wert, dann PK_value, dann Column1 Wert, dann PK_value ...

Die Festplatte Plattenteller dreht sich von einem physischen Ort zu einem anderen, kann dies Zeit brauchen.

Alles, was Sie in einem Index benötigen, ist effektiver, weil es bedeutet, eine Datei sequenziell zu lesen.