Wie kann ich feststellen, wann eine neue Tabelle für Daten erstellt werden muss, die aus einer Abfrage abgerufen werden können?

8

Wir haben eine Zahlungstabelle und Agenten erhalten eine Provision für Zahlungen. Die Provision basiert auf einigen verschiedenen Faktoren, z. B. wie lange es gedauert hat, bis die Zahlung eingegangen ist. Daher sind einige Berechnungen erforderlich, um den Provisionssatz zu ermitteln, den der Agent erhält, aber nichts übermäßig Komplexes.

Zum Beispiel wird es wahrscheinlich nie komplexer sein als dieses:

SELECT Payments.Amount * CASE 
    WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 1 THEN Rates.Rate1
    WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 2 THEN Rates.Rate2
    ELSE Rates.Rate3 END

Wäre es sinnvoll, eine zweite Tabelle zu erstellen, in der diese Daten gespeichert sind, anstatt sie jederzeit abzufragen? Oder sollte ich mich einfach an Laufzeitabfragen halten, bei denen die Daten abgerufen werden, wann immer sie angefordert werden?

Und was noch wichtiger ist: Welche Faktoren müssen verwendet werden, um zu bestimmen, ob eine Abfrage ausgeführt werden soll, wann immer die Daten benötigt werden, oder ob die Daten in einer eigenen Tabelle gespeichert werden sollen?

Rachel
quelle
2
Eine wichtige Frage lautet: Wie oft möchten Personen diese Daten abfragen? Handelt es sich um einen Bericht oder um einen stark frequentierten Bildschirm in der Anwendung?
ConcernedOfTunbridgeWells
@ConcernedOfTunbridgeWells In diesem Fall handelt es sich um einen Bericht, der einige Male im Monat ausgeführt wird, möglicherweise häufiger, wenn die Agenten den Bericht selbst ausführen, um ihre Provision anzuzeigen.
Rachel
Wahrscheinlich am besten, um es über Nacht in eine Berichtstabelle zu integrieren, und die Provision ist "ab letzter Nacht". Wenn Sie einen Abschlussprozess haben, in dem Sie schließen und dann Bericht erstatten müssen, können Sie in der App eine Funktion bereitstellen, um eine Neuerstellung zu erzwingen.
ConcernedOfTunbridgeWells
Nach meiner Erfahrung sind "AsOf" -Daten bei solchen Operationen im finanziellen Kontext ziemlich häufig. Daher sollte eine Tabelle (wie @ConcernedOfTunbridgeWells feststellt) mit einem solchen "AsOf" -Datum durchaus akzeptabel sein.
Swasheck
In Verbindung stehender Beitrag: dba.stackexchange.com/q/7592/2660
Nick Chammas

Antworten:

8

Wenn die Abfrage ziemlich selten ausgeführt wird (z. B. ein Bericht), ist es wahrscheinlich besser, die Tabelle im laufenden Betrieb zu erstellen 1 . Wenn die Abfrage häufig ausgeführt wird und die temporäre Tabelle für die Leistung erforderlich ist, liegt möglicherweise ein Problem vor.

  • Wenn die Tabelle billig zu erstellen ist, tun Sie dies als temporäre Tabelle. Solange die Datenbank schnell genug ist, können Sie damit durchkommen. Sie müssen jedoch die Leistung im Auge behalten.

  • Wenn die Tabelle nicht vollständig auf dem neuesten Stand sein muss, sondern Gegenstand relativ häufiger Berichterstellungsaktivitäten ist, ist eine regelmäßige Neuerstellung wahrscheinlich der beste Weg.

  • Wenn die Erstellung der Tabelle teuer ist, aber auf dem neuesten Stand sein muss, müssen Sie sie möglicherweise als denormalisierte Struktur verwalten, die entweder als indizierte Ansicht oder über Trigger verwaltet wird. Dies ist etwas komplizierter und belastet die Schreibvorgänge zusätzlich.

    In extremeren Fällen (dh bei großen Datenmengen) benötigen Sie möglicherweise einen hybriden Ansatz, bei dem historische Daten aus einer für die Leistung optimierten denormalisierten Struktur und aktuelle Daten aus der Live-Anwendung abgefragt werden.

    Die extremsten Fälle können dazu führen, dass Sie Data Mart-Feeds mit geringer Latenz und hybride OLAP-Lösungen erhalten. Dies ist also bei weitem die komplexeste in Bezug auf die Tiefe des Kaninchenlochs. Es wird am besten vermieden, es sei denn, Sie haben eine echte Anforderung.

In dem oben beschriebenen Fall klingt eine regelmäßige Neuerstellung einer Berichtstabelle angemessen. Wenn Sie mitten am Tag schließen müssen, um Berichte auszuführen, können Sie eine Funktion bereitstellen, um ein Update aus der Anwendung zu erzwingen. Andernfalls wird es über Nacht ausgeführt, und die Agenten können ihre Provision "wie um Mitternacht am vorherigen Arbeitstag" anzeigen.

1 select into Abfragen, die temporäre Tabellen erstellen, sind unter SQL Server recht schnell, da die Einfügevorgänge nur minimal protokolliert werden.

Zusammenfassend bestimmen Sie anhand der folgenden Faktoren, ob Sie eine neue Tabelle für Ihre Daten haben sollten oder nicht:

  • Wie oft werden die Daten benötigt?
  • Wie teuer es ist, die Daten zu erhalten
  • Wie aktuell die Daten sein müssen
ConcernedOfTunbridgeWells
quelle
1
Die einzigen zwei Faktoren, die Sie verwenden, um festzustellen, ob Sie eine permanente Tabelle für die Daten benötigen, anstatt sie bei Bedarf abzufragen, sind how often the data is neededund how expensive the query is?
Rachel
2
@Rachel - Außerdem: "Wie aktuell müssen die Daten sein?"
ConcernedOfTunbridgeWells
9

Ein Problem, das in der akzeptierten Antwort nicht behandelt wird, ist "Benötigen Sie diesen Wert im Laufe der Zeit" und "Wird sich die Formel möglicherweise ändern".

Betrachten Sie zum Beispiel das Kommissionsbeispiel. Wenn die Provision gezahlt wird, sollte der Betrag gespeichert werden, da dies eine historische Zahl dessen ist, was tatsächlich gezahlt wurde. Der Weg zum calulate Provisionsverzeichnis könnte im nächsten Monat (und tut es häufig) ändern , aber das wird nicht das, was tatsächlich bezahlt ändern , welche müssen separat gespeichert werden.

Es ist die gleiche Idee wie das Speichern des Preises, den der Kunde tatsächlich für ein Produkt bezahlt hat (nach einer Berechnung der Rabatte usw.), anstatt sich auf eine Formel anhand einer Preistabelle zu verlassen, um etwas anderes als die anfängliche Berechnung zu tun, da der Produktpreis im nächsten Monat möglicherweise nicht der gleiche sein wie der Preis, als der Kunde die Bestellung aufgab.

Wenn Sie eine historische Aufzeichnung des Werts zu einem bestimmten Zeitpunkt benötigen, speichern Sie diesen Wert immer, nachdem Sie die Formel für die Erstberechnung verwendet haben.

HLGEM
quelle
Danke, das ist definitiv etwas zu beachten, wenn Sie diese Art von Entscheidung treffen. Diesmal ändert sich der Wert nicht, da der Provisionssatz einmal pro Agent und pro Kunde festgelegt wird, wenn der Kunde erhalten wird, und der verwendete Satz auf dem Datum der Zahlung und dem Datum basiert, an dem wir den Kunden erhalten haben sind Werte, die sich ändern.
Rachel
@Rachel - Keiner dieser Werte möchten Sie derzeit ändern. Wenn sie sich ändern, können Sie natürlich jederzeit eine historische Datentabelle erstellen, wenn Sie diese benötigen, solange Sie das Problem nicht vergessen.
Psr
0

Wahrscheinlich nicht von Interesse, wenn Sie an eine bestimmte Datenbank gebunden sind, aber MariaDB (MySQL-basiert) ähnelt etwas Wunderbares, das als "virtuelle Spalten" bezeichnet wird und entweder im laufenden Betrieb berechnet oder im tatsächlichen Speicher zwischengespeichert werden kann, jedoch automatisch nach Bedarf neu berechnet. Ich habe diese Funktionalität vermisst, seit ich FileMaker Pro vor vielen Jahren für die SQL-Welt verlassen habe ...

Jan Steinman
quelle