Die Indizierung von Sichten in SQL Server 2008
Ich habe eine Tabelle, die mehrere hundert Millionen Datenzeilen. Es gibt ein Feld namens EventId
was ist ein integer-Feld.
Ich habe eine Reihe von unterschiedlichen Ansichten, die werden wieder nur Daten mit einer bestimmten Ereignis-id
Wenn ich eine Abfrage ausführen
SELECT TOP 1000 * FROM vw_MyView
Dauert es 5 Minuten, um die Zeilen zurückzugeben, die. Was brauche ich, Indizes hinzufügen? Derzeit gibt es Indizes, die auf die master-Tabelle für den primary key (clustered auf LogId
) und ein non-clustered auf EventId
wie wird verwendet in der where-Klausel von jedem Blick.
Weiß ich Ansichten können indiziert werden, was field(s) sollte ich die Indizierung in der Ansicht? Sollte ich einfach den DB-Engine, Tuning Wizard, und sehen, was es sagt?
UPDATE nach dem feedback
Meiner master-Tabelle mit allen Daten drinnen ist, entlang der Linien von dem folgenden schema
LogId (int) PK
EventId (int)
Param1 varchar(255)
Param2 varchar(255)
..
..
..
Param24 varchar(255)
Jeder event-Typ hat unterschiedliche Parameter, daher die generische Feldnamen in der master-Tabelle.
Habe ich eine Ansicht für jede Art von Veranstaltung, wo die ParamX Felder in der master-Tabelle eine richtige Feld name durch die anzeigen.
So den Blick für ein event wäre so etwas wie
SELECT LogId, Param1 AS Name, Param2 AS Address1, Param3 AS Address2
WHERE EventId = 10
Ich habe versucht, die Abfrage
SELECT TOP 1000 LogId from vw_MyView
und das klappte auch schnell. Es ist den anderen Feldern, die ihn verlangsamen, was ich davon ausgehen ist bis auf schlechte Indizierung?
UPDATE 2 - Mehr Infos
Zuvor die Daten für jedes Ereignis wurde in einer Tabelle gespeichert, die für jedes Ereignis. Dies bedeutete, dass das hinzufügen von neuen Ereignissen erfordern würde, eine neue Tabelle für jede.
Ich bin Massenimport von Daten in eine temp-Tabelle und verschieben, dass in meiner master-Tabelle. Die bulk-import macht es schnell, aber ich bin besorgt, dass eine so große master-Tabelle könnte bedeuten, dass die Abfrage es wird so langsam, dass es unbrauchbar ist.
Den Millionen von Zeilen von Daten ist über 10 Jahre oder so und so konnte ich vermutlich die ersten 8 Jahre von Daten in eine andere Datenbank für Archiv-Zwecke, so dass nur die letzten 2 Jahre aufbewahrt werden.
Ist also die Frage kann ich weiterhin mit der master-Tabelle Ansatz würde erfordern keine Wartung, aber potenziell viel von Indizierung, oder gehen Sie zurück auf die ursprüngliche Ansatz, mit einer Tabelle pro Veranstaltung?
Danke für das feedback Jungs, wirklich zu schätzen
- Sie post müssen Sie die definition der Sicht und erläutern einige der Fragen, die Sie müssen ausführen von es. In der Regel Aussicht mehr Spalten enthalten, als nötig, um viele verschiedene Abfragen, in denen die Abfragen würde wahrscheinlich profitieren, besser von der Ausrichtung auf nur die relevanten Tabellen und Spalten direkt. Auch * und OBEN ohne ORDER BY nicht sind großartige Beispiele dafür, wie man wirklich mit dieser Ansicht. Bitte Lesen Sie diese und den Kommentaren: sqlblog.com/blogs/aaron_bertrand/archive/2010/03/07/...
- Ich aktualisiert meine Antwort um zu zeigen, wie ich versuchen würde, sich mit der besonderen Ansicht, die Sie erwähnten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Regel Aussicht mehr Spalten enthalten, als nötig, um viele verschiedene Abfragen, in denen die Abfragen würde wahrscheinlich profitieren, besser von der Ausrichtung auf nur die relevanten Tabellen und Spalten direkt. (Ich gebloggt dies im Jahr 2010.) In deinem Fall denke ich nicht, dass die Indizierung der Blick wird Ihnen helfen,... die Abfragen, die Sie schreiben würde, nur scan, index anstelle des gruppierten index auf der Basis-Tabelle (und da Sie nicht tun, Aggregationen, es geht um die gleiche Anzahl von Zeilen, aber wahrscheinlich weniger Seiten). Ich denke die bessere Lösung ist die Optimierung der Indizes der zugrunde liegenden Tabelle.
Einen index ich könnte darauf hindeuten, dass sollte entscheidend dazu bei, die Abfrage, die Sie zeigten aus Ihrer Sicht für die Veranstaltung 10:
Da dieser index umfasst die Abfrage, und da der filter reduziert die Anzahl der Zeilen, die gescannt werden sollen, sollte dies eine deutliche Verbesserung.
Können Sie mit diesem experiment mit /ohne INCLUDE-Teil. Es kann sein, effizient genug, um ziehen Sie diese aus dem gruppierten index. Aber ich denke das würde nicht die beste option sein.
Nun, nicht ausrasten hier - wie ich unten erklären, Sie wollen nicht immer zu 100 werfen Indizes auf einer Tabelle zu perfekt erfüllen 100 unterschiedliche Abfragen - es ist die balance zu finden zwischen der Befriedigung der Abfragen und nicht dass Sie, Ihr schreibt in Melasse.
Zeige ich Euch ein paar Worte auf dem Database Engine Tuning Advisor (DTA).
Dieser Assistent ist keine Magie. Es gibt keinen Schaden in Sie Sie und sehen, was es sagt, aber Sie sollten nicht nur alle seine Empfehlungen und umzusetzen. Ich schlage vor, ein paar Dinge, wenn Sie dieses tool verwenden:
DBSophic hat viel bessere tools als den Indexoptimierungs-Assistenten - Sie übernehmen die gesamte workloads in die Betrachtung ein und bieten nicht redundanten Indizes. Qure Analyzer ist kostenlos und bietet eine Teilmenge der Funktionen, die in den Qure Optimizer.
Ich glaube, Sie sind verwirrend Indizierte Sichten mit Ansichten. Indizierte Sichten können (müssen) haben Indizes natürlich, aber das bedeutet nicht, müssen Sie die Verwendung einer indizierten Sicht, um für die SQL Server-Indizes verwendet werden. Es verwenden alle Indizes der zugrunde liegenden Tabellen in regelmäßigen Ansichten, wenn es der Auffassung ist, dass mit dem index schneller ist.
Also, starten Sie durch die Untersuchung der SQL für die Ansicht, und festzustellen, welche Indizes können helfen, die Abfrage auszuführen schneller. Wenn Sie nach der SQL für die Ansicht, wir können vorschlagen, einige Ideen.
Auch Ihre select-Anweisung keine ORDER BY-Klausel enthalten, so ist es eine nicht-deterministische Abfragen. In anderen Worten, erhalten Sie möglicherweise unterschiedliche Ergebnisse auf den nachfolgenden läuft, auch wenn die Daten nicht geändert.
Hinblick auf die
EventId
Spalte, können Sie versuchen, einen index hinzufügen, um es, aber kann es nicht helfen. Es hängt von der Kardinalität der Daten in dieser Spalte.Sollten Sie nicht indizierte sichten erstellen, die auf Tabellen mit "mehreren hundert Millionen Datenzeilen".
Ein regelmäßiger Blick ist nur eine SQL-Anweisung gespeichert, die auf Ihre Datenbank , so dass, wenn Sie ausführen wählen Sie * aus
your_view
, sql-server, ändern Sie einfachyour_view
für Ihr wählen Sie.Wenn Sie indexieren wollen, mit einem Blick, müssen Sie zur Speicherung der Daten auf der Datenbank, was bedeutet, dass eine physikalische Kopie der indizierten Spalten in der DB. Wie Sie sich vorstellen können, es wird drastisch erhöhen Sie die Speicherkapazität Größe, wenn Sie haben, die Menge der Zeilen, speziell wenn Sie sich, die große Tabelle mit anderen Tabellen