SQL-Ansicht oder Tabelle

8

Ich habe eine Tabelle mit Daten, die einmal pro Woche aktualisiert werden. Ich habe dann eine Abfrage, die diese Daten verarbeitet und im Wesentlichen eine Liste von Codes und die Anzahl der Stunden, die für diese Codes gebucht wurden, zurückgibt. Diese Abfrage ist relativ kompliziert und dauert etwa 5 Sekunden.

Diese Daten müssen von vielen anderen Abfragen in der DB verwendet werden, also möchte ich sie irgendwo platzieren, dass sie von anderen Abfragen leicht zugänglich sind. Dies zu tun, schien eine gute Idee zu sein, aber das bedeutet, dass jedes Mal, wenn diese Ansicht aufgerufen wird, diese Abfrage erneut ausgeführt wird, was 5 Sekunden dauert, wenn es viele Aufrufe auf einmal gibt App zu verlangsamen.

So dachte ich, wäre es besser, diese Ansicht als Tabelle zu erstellen, wenn die Daten an einem Montag importiert werden, da dies die einzige Änderung ist. Ist das die beste Idee, oder sehe ich das falsch an?

    
Sam Cogan 02.02.2010, 11:23
quelle

7 Antworten

2

Ich beschäftige mich mit den gleichen Problemen mit den meisten meiner Projekte.

Wir haben zahlreiche Daten, die für verschiedene Zwecke neu organisiert werden müssen. Darüber hinaus profitieren wir von einer Unternehmenskultur, die für Batch-Jobs und Overnight-Prozesse verwendet wird, so dass die Benutzer über die Datenschnappscharfe gut informiert sind. Die meisten Benutzer müssen die Daten nach Excel exportieren

Die Verwendung zusätzlicher Tabellen ist ein sinnvoller Weg, um hierher zu kommen.

Persönlich gebe ich diesen Tabellen einen Unterstrich voran.

%Vor%

Dies erlaubt mir, bequem Tabellen von Entitäten zu identifizieren, die eine aktive Rolle im normalen Betrieb des Systems spielen.

    
Paul Alan Taylor 02.02.2010, 11:31
quelle
3

Ein Kollege wies mich auf "Materialized Views" hin.

Ссылка

Sie kopieren Daten aus einer Sicht in eine Tabelle und verwenden diese Tabelle als Sicht. Der Punkt in dieser Präsentation (Link) ist, dass Sie mit Triggern und Funktionen arbeiten können, um nur einige Teile dieser Tabelle zu aktualisieren.

Sehr nützlich, ich habe eine solche materialisierte Ansicht in SQL Server implementiert.

    
Arthur 02.02.2010 12:26
quelle
2

Klingt nach einem vernünftigen Weg.

Da die Abfrage teuer ist, klingt das Veröffentlichen der Ergebnisse in einer "Bericht" -Tabelle, die von anderen Anwendungen verwendet werden soll, wie ein guter Kompromiss.

Solange die Benutzer dieser Daten damit zufrieden sind, sich so zu ändern, wie Sie es beschreiben, ist Ihr Ansatz in Ordnung.

    
Oded 02.02.2010 11:26
quelle
1

Wenn Ihre Ansichtsstruktur es ermöglicht, sie zu indizieren, können Sie eine indizierte Sicht erstellen (die eigentlich nur eine Kopie der Daten ist, die aktualisiert werden, wenn die zugrunde liegenden Tabellen aktualisiert werden).

Nicht jede Abfrage ermöglicht jedoch die Indexierung einer Ansicht darüber.

Wenn Ihre Daten keine Sekunde-zu-Sekunde-Istwerte sind, dann ist das Erstellen einer Tabelle OK .

    
Quassnoi 02.02.2010 11:28
quelle
0

Sie "sehen" immer noch Ihre Zeilen, egal ob in einer Tabelle oder in einer Ansicht der Tabellenzeilen.

Ich würde zuerst versuchen, Ihre Abfrage zu optimieren (schlagen Sie Ihre Indizes, vielleicht hinzufügen / aktualisieren / ändern Sie Ihre Indizes) und führen Sie es durch einen Profiler. Profiler bieten einen wunderbaren Einblick ... in den Entscheidungsplan Ihrer Datenbank.

    
Kris Krause 02.02.2010 11:27
quelle
0

Ja, es ist der erste Schritt in Richtung Data Warehouse :) Natürlich sollten Sie sicherstellen, dass Ihre neue Tabelle immer nach jedem wöchentlichen Update erstellt wird.

    
sergiom 02.02.2010 11:31
quelle
0

Ich habe ähnliche Probleme in meinem Produktions-Support gesehen, wo ich mit einem großen Datawarehouse umgehen muss. Im Grunde genommen habe ich Tabellen mit einem Shell-Skript erstellt. Das Shell-Skript läuft folgendermaßen ab:

  1. Wenn die temporäre Tabelle existiert, löschen Sie sie es.
  2. Führen Sie die Abfrage aus, indem Sie eine Tabelle erstellen wie create table x as (select ....)
  3. Verwenden Sie die temporäre Tabelle und Erstellen Sie als das temporäre Tabellen / übertrifft.
  4. Lassen Sie die temporäre Tabelle fallen, wenn Sie dies nicht tun Brauche es mehr oder behalte es, wenn du es bist glaube nicht, dass es deine Platte essen wird Raum.

All dies kann mithilfe eines einfachen Shell-Skripts erfolgen. Ich fand es sehr nützlich und auch jetzt läuft es effektiv.

    
Vijay 02.02.2010 13:41
quelle

Tags und Links