2010-01-25 11 views
35

Ich habe ein paar Indexansichten ausprobiert und bin beeindruckt, aber ich brauche fast immer ein Maximum oder Minimum und kann nicht verstehen, warum es mit diesen nicht funktioniert, kann mir jemand erklären warum?Warum können indizierte Sichten kein MAX() - Aggregat haben?

Ich weiß, dass sie nicht erlaubt sind, ich kann einfach nicht verstehen warum !!! Anzahl usw. ist erlaubt Warum nicht MIN/MAX, ich suche nach Erklärungen ...

Antwort

69

Diese Aggregate sind nicht zulässig, da sie nicht allein aufgrund der geänderten Werte neu berechnet werden können.

Einige Aggregate, wie COUNT_BIG() oder SUM(), können einfach neu berechnet werden, indem man sich die geänderten Daten anschaut. Diese sind in einer indizierten Sicht zulässig, da sich die Auswirkung dieser Änderung direkt berechnen lässt, wenn sich ein zugrunde liegender Wert ändert.

Andere Aggregate, wie MIN() und MAX(), können nicht neu berechnet werden, indem nur die Daten betrachtet werden, die gerade geändert werden. Wenn Sie den Wert löschen, der aktuell der Höchstwert oder der Mindestwert ist, muss der neue Höchstwert oder Mindestwert gesucht und in der Tabelle gesamt gefunden werden.

Das gleiche Prinzip gilt für andere Aggregate, wie AVG() oder die Standardvariationsaggregate. SQL kann sie nicht nur anhand der geänderten Werte neu berechnen, sondern muss die gesamte Tabelle erneut durchsuchen, um den neuen Wert zu erhalten.

+0

Hah, du hast es geschafft! –

+0

Sie könnten unterstützt werden, wenn Sie die Tabelle so beschränken, dass nur 'insert'-Operationen erlaubt werden, nicht' update' oder 'delete'. (Wenn Sie eine dieser Einstellungen verwenden möchten, müssen Sie die indizierte Sicht löschen und anschließend neu erstellen.) Viele Tabellen sind nur für den praktischen Einsatz insert-fähig und würden von einer Möglichkeit profitieren, "max" und "max" zu beschleunigen 'min' Anfragen. –

2

Aggregatfunktionen wie MIN/MAX werden in indizierten Sichten nicht unterstützt. Sie müssen die MIN/MAX in der Abfrage um die Ansicht tun.

Es gibt eine vollständige Definition, was in einer indizierten Sicht here (SQL 2005) erlaubt ist und was nicht.
Zitat:

Die AVG, MAX, MIN, STABW, STDEVP, VAR, oder VARP Aggregatfunktionen. Wenn AVG (Ausdruck) in Abfragen angegeben wird, um die indizierte Sicht verweisen, der Optimierer kann das benötigte Ergebnis häufig berechnen, wenn die Ansicht Liste auswählen enthält SUM (Ausdruck) und COUNT_BIG (Ausdruck). Zum Beispiel kann eine indizierte SELECT-Liste nicht den Ausdruck AVG (Spalte1) enthalten. Wenn die Ansicht SELECT-Liste enthält die Ausdrücke SUM (column1) und COUNT_BIG (column1) können SQL Server für eine Abfrage der Durchschnitt berechnen, dass verweist auf die Ansicht und gibt AVG (column1).

4

Neben den von Remus genannten Gründen ist es weniger sinnvoll, MIN und MAX zu unterstützen. Im Gegensatz zu COUNT() oder SUM() sind MAX und MIN schnell zu berechnen - Sie sind alle nach nur einer Suche gesetzt; Sie müssen nicht viele Daten lesen.

+0

Die Person, die downvoted, würden Sie gerne erarbeiten? –

+7

wahrscheinlich jemand, der einen guten Grund hatte, MIN oder MAX zu benötigen. Ich habe diese Frage bei der Suche nach einer Möglichkeit gefunden, einen solchen Index zu erstellen, da eine Abfrage von Minuten bis Sekunden erforderlich wäre.Die manuelle Pflege scheint die einzige Lösung zu sein, aber es ist keine, die mir besonders gefällt ... – jmoreno

Verwandte Themen