View Geschwindigkeit

ukulele

Datenbank-Guru
Beiträge
5.278
Ich lese schon ne weile diverse Artikel aber habe wenig hilfreiches bisher gefunden. Ich möchte meine View schneller machen und dazu am liebsten einen Index auf die View klatschen, nur scheinbar geht das nicht da sie GROUP BY und count(*) verwendet. Eigentlich möchte ich das Ergebniss irgendwie Puffern, aber ich kenne keine derartige Möglichkeit.

Die Notlösung wäre es, alles nochmal umzubauen und Tabellen mit Triggern zu befüllen. Trotzdem habe ich schon viel Zeit in die View variante Investiert. :(
 
Werbung:
Hey ukulele,

ich weiß nicht ob MSSQL so etwas unterstützt, aber in Oracle gäbe es diesbezüglich (wenn es im VIEW-Code kein Optimierungspotential mehr gibt) sogenannte Materialized - Views. Diese können inkrementell zeitgesteuert oder mittels Trigger refreshed werden.

Kannst du eventuell den Viewcode posten?

PS: wie kann ich Code hier im Forum besser darstellen?

LG
 
Hey ich hab noch etwas bezüglich Indexed VIEWs gefunden.

Hier ein Beispiel von der MS-Seite:

CREATE VIEW Vdiscount1 WITH SCHEMABINDING AS
SELECT SUM(UnitPrice*OrderQty) AS SumPrice,
SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS SumDiscountPrice,
COUNT_BIG(*) AS Count, ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
GO
CREATE UNIQUE CLUSTERED INDEX VDiscountInd ON Vdiscount1 (ProductID)
Lg
 
Meldung 4512, Ebene 16, Status 3, Prozedur unt_index_suche_fragmente, Zeile 4
Das Sicht-Objekt 'xxx' kann nicht an ein Schema gebunden werden, da der Name 'xxx' bei der Schemabindung ungültig ist. Namen müssen ein zweiteiliges Format aufweisen, und ein Objekt kann nicht auf sich selbst verweisen.

Keine Ahnung wo sein Problem liegt.
 
Systemobjekte nicht, mein Tabellennamen ist allerdings ein weiterer SELECT mit Alias, daran wird es wohl liegen. Wobei ich den Sinn dieser Einschränkung überhaupt nicht verstehe, aber ich glaube allein aus Perfomance Gründen werde ich eine Temporäre Tabelle aufbauen und die berechneten Sachen da rein schreiben und nicht weiter auf diesem View Ding beharren. Ein Aufruf der Sicht dauert mitlerweile 1:14
 
Den Sinn der Einschränkung kann ich auch nicht verstehen!!!
Eine temporäre Tabelle wäre hier vl. wirklich sehr sinnvoll. Bei Oracle kann das Table-Logging mit "ALTER Table Tablename NOLOGGING" deaktiviert werden, weiß jedoch nicht, ob dies bei MSSQL auch möglich ist. Dann würden zumindest (bei großen Datenmengen) keine Logfiles unnötigerweise erzeugt werden.

Lg
 
Ich habe das Problem jetzt umgangen in dem ich mit mehreren Tabellen arbeite die von einem Trigger befüllt werden, funktioniert um einiges schneller, auch wenn die größte mit 3 GB und 17 Mio Einträgen zu buche schlägt.
 
Werbung:
Freut mich zu hören, dass du eine für dich relativ akzeptable Lösung gefunden hast!
Sofern der Speicherplatz hier nicht ein Problem darstellt!
Aber besser, als hättest du weiterhin eine VIEW verwendet und um die Performance der VIEW zu verbessern (Annahme: View-Code ist bestens optimiert) die Hardware aufrüsten zu müssen! ;-)

Lg
 
Zurück
Oben