2009-06-22 10 views
2

Ich versuche, eine Ansicht aus einem ziemlich komplexen Select-Abfrage erstellen, und es wird nicht lassen Sie mich einen Clustered-Index, da ich Unterabfragen und einige Aggregatfunktionen verwenden müssen.sql Server Clustered-Index in einer Ansicht

Ich muss einen Clustered-Index auf es andernfalls die Abfragen, die die Ansicht verwenden, ewig dauern. Offenbar speichert SQL Server nur die Ergebnismenge, wenn Sie eine dumme Menge an Kriterien erfüllen.

Die Basistabellen für die Ansicht sind schreibgeschützt und werden nur einmal täglich durch einen Massenimport aktualisiert. Ich kann nicht sehen, warum die Ergebnisse nicht zwischengespeichert werden können.

Kennt jemand eine Möglichkeit, SQL-Server die Ergebnisse einer Ansicht zwischenzuspeichern, so dass sie wiederum später abgefragt werden können? Ich möchte nicht wirklich eine andere Tabelle cos erstellen, die in einem Haufen von Änderungen überall auf der Welt verschnaufen würde.

Vielen Dank im Voraus.

+1

Bitte senden Sie eine vollständige Probe –

+4

Wenn Sie bedenken, dass Ihre Tabellen nur einmal am Tag aktualisiert werden, wie füllt sich das Ausfüllen einer Tabelle einmal täglich mit den Ergebnissen Ihres Abfrage-Schneeballs in mehr Änderungen als eine Ansicht? –

+0

post ein echtes Beispiel & ich bin sicher, jemand wird Ihnen eine praktikable Lösung geben. Es gibt Optionen wie berechnete Spalten, die Ihr Problem beheben können –

Antwort

3

Ich denke, die Antwort, die Sie suchen, ist: Verwenden Sie keine Ansicht, um dies zu tun. Verwenden Sie eine Tabelle mit den Feldern, die den zurückgegebenen Feldern der SQL-Abfrage entsprechen. Automatisieren Sie die Abfrage zum Auffüllen dieser Tabelle

+0

Ich denke, Ihr Recht und danke an alle anderen, die einen Vorschlag gepostet haben. Das System ist eine Ergänzung zu einem großen, alten CMS, das für bestimmte Geschäftsanforderungen eingesetzt wird. Ich massiere im Wesentlichen ihre schlecht strukturierten Daten, um die Entitäten, an denen sie interessiert sind, genauer zu modellieren. – andrej351

1

Die kurze Antwort ist, dass ein gruppierter Index nicht erstellt werden kann, aus den Gründen, die Sie erwähnen.

Wenn Sie nach einer Möglichkeit zum Zwischenspeichern der Ergebnisse der komplizierten Abfrage fragen, ist das einzige andere Objekt, das SQL Server bereitstellt (und Ihr Problem löst), eine Tabelle.

Wenn die Automatisierung ein Problem darstellt, sollten Sie die Ansicht erstellen, aber nur als eine Möglichkeit zum Einfügen in eine Tabelle verwenden, sodass Sie die Tabelle unmittelbar nach der Auswahl aus der Ansicht schneiden/einfügen können der Masseneinsatz.

Wenn Sie SSIS (SQL Server Integration Services) verwenden, ist dies eine relativ triviale Sache hinzuzufügen.

+0

danke Mann, weitere Informationen in den Kommentaren unter – andrej351

1

Soweit ich weiß, bei der Kompilierung von Ausführungsplänen kopiert und fügt SQL Server im Wesentlichen die Definition der Ansicht in die Abfrage kompilieren - solange Sie Indizes zu den zugrunde liegenden Tabellen hinzufügen können, sollte es möglich sein um eine gute Leistung von der Abfrage zu erhalten.

+0

Ich sehe keinen Grund, dies zu downvote. Mit den Informationen in der Frage gibt es keine Möglichkeit zu wissen, dass die zugrunde liegenden Tabellen ordnungsgemäß indiziert sind oder nicht. –

+0

gibt es ein zusätzliches Problem eines ORM (Entity Framework), das auf all dem sitzt und zusätzlichen Overhead verursacht. Die Abfrage besteht aus 3 linken äußeren Joins und 5 verschachtelten Abfragen. Wenn ich also Zeit bekomme, tausche die Tabellennamen aus und poste sie – andrej351

+0

Wenn du auch einen Expectionsplan posten kannst, dann ist die Chance, dass jemand hierauf hinweisen kann Flaschenknechte. Vielleicht möchten Sie auch versuchen, die Abfrage durch den Index Tuning Wizard zu setzen (falls Sie dies noch nicht getan haben) – Justin

1

Was Sie erstellen, klingt wie ein Data Warehouse, daher ist Ihre beste Option, die Daten zu manipulieren, sobald sie im System sind. Sie können neue denormalisierte Tabellen erstellen (oder sonst wie Sie sie ändern) und sie indizieren, um eine schnelle Abfrage zu ermöglichen.

Sie können dann Ansichten auf diese Tabellen erstellen, wenn Sie benötigen.

+0

Vielen Dank auch für Ihren Rat, siehe Kommentar unten. – andrej351

+0

Ein Data Warehouse könnte es sich lohnen, langfristig zu investieren, vielleicht meine Antwort zu verwenden, um die kurzfristige Lösung zu bekommen, zu überlegen, ob ein Lager langfristig helfen kann – Stuart

0

Ich hatte das gleiche Problem und landete die Unterabfragen in Clustered-Index-Ansichten selbst.

1

wenn Aggregate in einer indizierten Sicht verwenden Sie brauchen nicht

auch erstellt werden COUNT_BIG() anstelle von COUNT() sonst die Sicht zu verwenden, wenn Sie nicht auf Enterprise Edition sind, müssen Sie den NOEXPAND Hinweis liefern sonst wird das Optimierungsprogramm verwenden, um die Ansicht nicht

SELECT * 
FROM YourView WITH(NOEXPAND) 
WHERE .... 

Vielleicht brauchen Sie keine Aussicht, aber Sie haben einfach nicht th richtigen Indizes für die Tabellen, können Sie die DDL der Tabellen (einschließlich Indizes und Constraints schreiben)