Clustered Columnstore-Indizes und Fremdschlüssel

18

Ich optimiere ein Data Warehouse mithilfe von Indizes. Ich bin ziemlich neu in SQL Server 2014. Microsoft beschreibt Folgendes:

"Wir betrachten den Clustered-Columnstore-Index als Standard für das Speichern von Faktentabellen für große Data-Warehouses und erwarten, dass er in den meisten Data-Warehousing-Szenarien verwendet wird. Da der Clustered-Columnstore-Index aktualisierbar ist, kann Ihre Workload eine große Anzahl von Einfüge-, Aktualisierungs- und löschen. " http://msdn.microsoft.com/en-us/library/gg492088.aspx

Wenn Sie jedoch weiter in der Dokumentation lesen, finden Sie unter Einschränkungen und Einschränkungen:

Msgstr "Kann keine eindeutigen Bedingungen, Primärschlüsselbedingungen oder Fremdschlüsselbedingungen haben."

Das verwirrt mich sehr! Es wird empfohlen (nicht obligatorisch), Fremdschlüssel aus verschiedenen Gründen im Data Warehouse zu haben (Datenintegrität, für die semantische Ebene sichtbare Beziehungen ...).

Microsoft empfiehlt daher Clustered Columnstore-Indizes für Data Warehouse-Szenarien. Es kann jedoch keine Fremdschlüsselbeziehungen verarbeiten.

Habe ich Recht? Welche weiteren Ansätze würden Sie empfehlen? In der Vergangenheit habe ich in Data Warehouse-Szenarien einen nicht gruppierten Columnstore-Index verwendet, mit Drop und Rebuild für das Laden von Daten. Allerdings fügt SQL Server 2014 dann keinen wirklichen neuen Wert für Data Warehouses hinzu?

Überlaufstapel
quelle
Mit zunehmender Funktionsreife werden Sie feststellen, dass immer mehr dieser Funktionen unterstützt werden (zum Teufel, im Jahr 2012 waren Columnstore-Indizes schreibgeschützt!). In der Zwischenzeit wird Ihnen ein Kompromiss angeboten - großartige Leistung mit Einschränkungen oder gleich alt wie alt. Ich glaube auch nicht, dass sie damit gemeint haben, dass jede Tabelle in Ihrem DW geclusterte Columnstore-Indizes haben sollte und dass keine Tabellen irgendwelche Einschränkungen haben sollten - es gibt wahrscheinlich eine begrenzte Anzahl von Tabellen in jedem DW, die Ihnen einen Riesenknall für die geben würden Dollar.
Aaron Bertrand
3
Achtung, es kann mit Joins umgehen. Eine FK-Beziehung ist für einen Join nicht unbedingt erforderlich. Es ist dazu da, die referenzielle Integrität zu behandeln - was nett ist, aber in einem Data Warehouse kann darauf verzichtet werden. In Gefahr, ja, aber auch mit einem Leistungsgewinn.
TomTom
8
Auch - "kein wirklicher neuer Wert"? Sie meinen, beschreibbar und gruppiert zu sein, hört sich für Sie nicht nach einer Verbesserung an? Wenn Benutzer in der Lage sind, Daten in Echtzeit abzufragen, anstatt auf einen Drop zu warten und neu zu erstellen, um mehr aktuelle Daten zu erhalten, scheint dies für Ihre Benutzer keine gute Sache und für Sie weniger Wartung zu sein? Achselzucken
Aaron Bertrand
Sie können (eindeutige) Indizes erstellen, indem Sie eine indizierte Ansicht erstellen. Es scheint, dass die Infrastruktur für die Indexpflege bereits vorhanden ist. Es ist nur so, dass normale Indizes (noch) nicht implementiert sind.
usr
@AaronBertrand In einem DWH-Szenario mit Faktentabellen mit Fremdschlüsseln funktioniert der Clustered Columnstore-Index nicht. Dies steht im Gegensatz zu Microsoft, das dies als Standard zum Speichern großer Faktentabellen erwartet. Ich hoffe du kannst mir das Gegenteil beweisen ...? Weil ich SQL Server mag.
OverflowStack

Antworten:

13

Sie haben hier viele Fragen:

F: (Das Fehlen von Fremdschlüsseln) verwirrt mich sehr! Es ist eine gute Praxis (nicht obligatorisch), Fk's aus verschiedenen Gründen in der DWH zu haben (Datenintegrität, für die semantische Schicht sichtbare Beziehungen, ....).

A: Richtig, es ist normalerweise eine gute Praxis, Fremdschlüssel in einem Data Warehouse zu haben. Clustered Columnstore-Indizes unterstützen dies jedoch noch nicht.

F: Also befürwortet MS Clustered Column-Speicherindizes für DWH-Szenarien. Sie können jedoch keine FK-Beziehungen verarbeiten ?!

A: Microsoft stellt Ihnen Tools zur Verfügung. Es liegt an Ihnen, wie Sie diese Tools verwenden.

Wenn Ihre größte Herausforderung in der mangelnden Datenintegrität in Ihrem Data Warehouse besteht, ist das gewünschte Tool die Verwendung herkömmlicher Tabellen mit Fremdschlüsseln.

Wenn Ihre größte Herausforderung die Abfrageleistung ist und Sie bereit sind, Ihre eigene Datenintegrität als Teil des Ladeprozesses zu überprüfen, ist das gewünschte Tool die Clustered-Columnstore-Indexe.

F: Allerdings fügt SQL 2014 dann keinen echten neuen Wert für DWH hinzu?

A: Zum Glück war der Clustered Columnstore nicht das einzige neue Feature in SQL Server 2014. Sehen Sie sich beispielsweise den neuen Cardinality Estimator an.

F: Warum bin ich so wütend und bitter darüber, wie mein Lieblingsfeature implementiert wurde?

A: Du hast mich erwischt - du hast diese Frage nicht wirklich gestellt - aber ich werde sie trotzdem beantworten. Willkommen in der Welt der Software von Drittanbietern, in der nicht alles nach Ihren genauen Spezifikationen erstellt wird. Wenn Sie leidenschaftlich an einer Änderung interessiert sind , die Sie in einem Microsoft-Produkt sehen möchten , lesen Sie Connect.Microsoft.com . Es ist ihr Feedback-Prozess, bei dem Sie eine Änderung einreichen können, andere Personen sie abstimmen können und das Produktteam sie dann liest und Ihnen mitteilt, warum sie sie nicht implementieren. Manchmal. Meistens markieren sie es einfach als "Nicht reparierbar, funktioniert auf meinem Computer", aber hey, manchmal erhalten Sie einige Antworten.

Brent Ozar
quelle
"Richtig, es ist normalerweise eine gute Praxis, Fremdschlüssel in einem Data Warehouse zu haben." -> SQLCAT - Die 10 besten Methoden zum Erstellen eines relationalen Data Warehouse in großem Maßstab ... "Erstellen Sie nicht gruppierte Indizes für jeden Fremdschlüssel." -> Nichts über die Durchsetzung der in dem Link erwähnten FK-Beziehung, und das Nicht-CI ist aufgrund des Spaltenspeichers überflüssig. Sie stimmen also zu, dass keine FK in der Faktentabelle erforderlich ist. Interessiert an Ihren Gedanken dazu.
Adrian Torrie
1
... und für Dimensionen: "Vermeiden Sie das Erzwingen von Fremdschlüsselbeziehungen zwischen den Fakt- und den Dimensionstabellen, um ein schnelleres Laden der Daten zu ermöglichen. Mit NOCHECK können Sie Fremdschlüsselbeschränkungen erstellen, um die Beziehungen zu dokumentieren. Erzwingen Sie diese jedoch nicht. Stellen Sie die Datenintegrität sicher "Obwohl Lookups transformieren oder die Datenintegritätsprüfungen an der Datenquelle durchführen"
Adrian Torrie,
6

Ich kann verstehen, dass Sie das Gefühl haben, Teile, an die Sie gewöhnt sind, fehlen. Das liegt aber nur daran, dass sie fehlen.

Trotzdem wurde SQL Server erfolgreich eingesetzt, als Fremdschlüssel nur ein Konzept waren (das wir damals durch Trigger implementiert haben), keine physische Implementierung wie eine Einschränkung. Die deklarative referenzielle Integrität war zumindest bei SQL Server 7.0 vorhanden, jedoch viel schwächer als bei der aktuellen Implementierung.

In Bezug auf den Wert des Clustered ColumnStore-Index wird ein Index bereitgestellt, und die Zeilen können aktualisiert werden. Sie finden diese Diskussion möglicherweise hilfreich: http://sqlwithmanoj.com/2014/07/24/maintaining-uniqueness-with-clustered-columnstore-index-sql-server-2014/

Manoj weist darauf hin, dass es eine Möglichkeit gibt, eine indizierte / materialisierte Ansicht über dieser Tabelle mit dem Clustering-Schlüssel als PK (1. Spalte der Tabelle / Ansicht) zu erstellen. Ob das zu Ihnen passt, ist natürlich eine Entscheidung, die Sie treffen müssen.

Aber, wie Aaron Bertrand und TomTom bemerkten, dreht sich alles um eine bessere Leistung. Wenn Sie die anderen Probleme , die Sorge verwalten können (und ich glaube , dass sie sind überschaubar) , dann bekommt man eine ganze Reihe von Vorteilen. So verwenden Sie die columns für das, was der Lage ist zu tun , sich die fehlenden Funktionen und zu verwalten.

RLF
quelle
2

Diese Frage bezieht sich auf SQL 2014, ich möchte jedoch angesichts der in SQL 2016 vorgenommenen Änderungen an Columnstore-Indizes zusätzliche Informationen bereitstellen, da es schwierig sein kann, die Einschränkungen in verschiedenen Versionen zu klären, und diese Frage bei Google immer noch recht häufig auftritt:

In SQL 2016 beschreibt Microsoft eine Methode zur Verwendung von nicht gruppierten Btree-Indizes (die jetzt als sekundäre Indizes für eine gruppierte Columnstore-Tabelle hinzugefügt werden können), um Fremdschlüsseleinschränkungen durchzusetzen, vorausgesetzt, die Einschränkung wird vor dem Columnstore-Index hinzugefügt: https: // docs .microsoft.com / de-de / sql / relational-database / indexes / columnstore-indexes-design-guidance

Niko Neugebauer hat auch einen Blogeintrag darüber; Es ist tatsächlich möglich, eindeutige / fremde Einschränkungen für Spaltenspeichertabellen zu erstellen (ich habe diesen Ansatz in meiner Arbeit angewendet): http://www.nikoport.com/2015/09/15/columnstore-indexes-part-66- Weitere Clustered-Columnstore-Verbesserungen in SQL Server 2016 /

Hexalm
quelle