Frage

Angenommen, ich brauche MyTab von luTab wie folgt zu aktualisieren

update myTab
  set LookupVale = (select LookupValue from luTab B
                                       where B.idLookup = myTab.idLookup)

luTab besteht aus 2 Spalten (idLookup (unique), LOOKUPVALUE)

Welche vorzuziehen ist: ein einzigartiger Clustered-Index für idLookup, oder ein auf idLookup und LOOKUPVALUE kombiniert? Ist eine abdeckende Index einen Unterschied in dieser Situation machen gehen?

(Ich bin meist in SQL Server interessiert)


Epilog:

Ich folgte Krips Tests unten mit 27M Reihen in MyTab, 1.5M Reihen in luTab. Der entscheidende Teil scheint die Einzigartigkeit des Index zu sein. Wenn der Index als eindeutig angegeben wird, verwendet das Update eine Hash-Tabelle. Wenn es nicht so einzigartig angegeben wird, dann zuerst das Update aggreates luTab von idLookup (das Stream-Aggegate) und verwendet dann eine verschachtelte Schleife. Das ist viel langsamer. Wenn ich den erweiterten Index verwenden, ist SQL jetzt nicht mehr assued, dass LOOKUPVALUE einzigartig ist, so ist es das viel langsamer nach unten gezwungen, Strom Aggregat-verschachtelten Schleife Route

War es hilfreich?

Lösung

Ich habe Ihre Tabellen erstellt und nur wenige Aufzeichnungen (50 oder so Lookup und 15 in MyTab) geladen.

Dann habe ich verschiedene Indexoptionen ausprobiert. Der Index auf luTab Sucht hat immer eine Gebühr von 29%.

Das interessante Bit ist, dass, wenn Sie in der LOOKUPVALUE Spalte in den Index auf luTab der Ausführungsplan zeigt zwei zusätzliche Schritte nach dem Index Seek hinzufügen: Stream-Aggregate und Assert. Während Kosten 0% beträgt, kann das mit mehr Daten steigen.

Ich habe auch einen nicht gruppierten Index auf nur idLookup, einschließlich LOOKUPVALUE als ‚inklusive Spalte‘ versucht. Auf diese Weise der Datenseiten müssen nicht, dass dieser Spalt abzurufen zugegriffen werden. Das kann eine Option für Sie sein, obwohl der Ausführungsplan nicht etwas anderes besagt (aber sie haben nicht den Stream-Aggregate / Assert entweder).

-Krip

Andere Tipps

Zum einen:

  • Eine Abdeckung Index ist immer nicht gruppierten
  • Sie sollten immer eine PK und einen Clustered-Index (es ist die gleiche standardmäßig auf SQL Server)

Die 2 Konzepte sind separate

So:

  • Ihre PK (geclustert) wäre idLookup wenn diese eine Zeile eindeutig
  • identifiziert
  • Die Abdeckung Index wäre (idLookup) enthalten (LOOKUPVALUE)

Allerdings:

  • idLookup ist die PK (geclustert), so dass Sie nicht eine Abdeckung Index benötigen
  • der gruppierten Index (PK) wird implizit „bedeckt“ von der Art eines gruppierten Index (einfach Index ist, Daten auf der untersten Ebene)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top