Frage

Ich begann vor kurzem mit einer riesigen „enterprisey“ Anwendung in einem Unternehmen zu arbeiten. Bei meinem letzten Job, entwarf ich die Datenbank, aber hier haben wir eine ganze Datenbank für Architektur-Abteilung, die ich bin nicht Teil.

Einer der Fremden Dinge in ihrer Datenbank ist, dass sie eine Reihe von Ansichten, die haben, anstelle den Benutzer mit den Datumsbereiche sie sehen wollen bieten, verbinden sich mit einer (globalen temporären) Tabelle „TMP_PARM_RANG“ mit einem Start- und Endtermin. Jedes Mal, wenn der Haupt-App eine Anfrage startet die Verarbeitung, das erste, was es tut „DELETE FROM TMP_PARM_RANG;“ ein Einsatz in sie dann.

Dies scheint eine bizarre Art und Weise, Dinge zu tun, und nicht sehr sicher, aber alle anderen hier scheint in Ordnung mit ihm. Ist das normal, oder ist meine Unruhe gültig?

Aktualisieren Ich sollte erwähnen, dass sie Transaktionen verwenden und pro-Client-Schleusen, so dass es gegen die meisten Concurrency Probleme bewacht. Auch gibt es buchstäblich Dutzende, wenn nicht Hunderte von Ansichten, die alle auf TMP_PARM_RANG.

War es hilfreich?

Lösung

Verstehe ich das richtig?

Es ist eine Ansicht wie folgt aus:

SELECT * FROM some_table, tmp_parm_rang
  WHERE some_table.date_column BETWEEN tmp_parm_rang.start_date AND tmp_parm_rang.end_date;

Dann in einigen Frontend gibt ein Benutzer einen Datumsbereich und die Anwendung führt Folgendes aus:

  1. Löscht alle vorhandenen Zeilen aus TMP_PARM_RANG
  2. Fügt eine neue Zeile in     TMP_PARM_RANG mit den Werten des Benutzers
  3. Wählt alle Zeilen aus der Ansicht

Ich frage mich, ob die Änderungen an TMP_PARM_RANG verpflichtet sind oder zurückgerollt, und wenn ja, wann? Ist es eine temporäre Tabelle oder eine normale Tabelle? Im Grunde genommen, abhängig von den Antworten auf diese Fragen kann der Prozess nicht sicher für mehrere Benutzer parallel auszuführen. Man hofft, dass, wenn dies der Fall wäre, hätten sie bereits entdeckt, dass und adressierte ihn, aber wer weiß?

Auch wenn es in einem Thread-sichere Art und Weise erfolgt, Änderungen an der Datenbank für einfache Abfrageoperationen macht nicht viel Sinn machen. Diese Löschungen und Einfügungen generieren Redo / Undo (oder was auch immer die äquivalent ist in einer Nicht-Oracle-Datenbank), die völlig unnötig ist.

Eine einfache und normalere Weise das gleiche Ziel zu erreichen wäre, diese Abfrage auszuführen, die Eingänge zu den Abfrageparameter des Benutzers Bindung:

SELECT * FROM some_table WHERE some_table.date_column BETWEEN ? AND ?;

Andere Tipps

Wenn die Datenbank Oracle, es ist möglicherweise eine globale temporäre Tabelle; jede Sitzung ihre eigene Version der Tabelle sieht und fügt / Löschungen werden nicht auf andere Benutzer auswirken.

Es muss ein geschäftlicher Grund für diese Tabelle sein. Ich habe mit Terminen gesehen Ansichten fest einprogrammiert, die tatsächlich eine partioned Ansicht waren, und sie wurden Daten als partioning Feld. Ich habe auch auf einem Tisch gesehen Beitritt wie beim Umgang mit Daylights Spar mal einen Blick vorstellen, die alle Aktivitäten zurück, die während der Sommerzeit aufgetreten. Und keines dieser Dinge jemals in die Tabelle löschen und einfügen ... das ist nur ungerade

Also entweder gibt es einen tieferen Grund dafür, dass aus gegraben werden muss, oder es ist nur etwas, das wie eine gute Idee zu der Zeit schien aber, warum es auf diese Weise als Stamm-Wissen verloren getan wurde.

Ich persönlich vermute, dass es eine ziemlich seltsame Auftreten sei. Und von dem, was Sie sagen, zwei Methoden, um den Prozess zur gleichen Zeit aufrufen könnte sehr interessant sein.

Normalerweise Datumsbereiche werden als Filter in einer Ansicht erfolgt und nicht durch äußere Werte in anderen Tabellen gespeichert ist, angetrieben.

Die einzige Rechtfertigung ich dafür ist, sehen könnte, wenn es ein mehrstufiger Prozess war, dass nur ein einziges Mal zu einem Zeitpunkt ausgeführt wurde und die Daten werden für mehrere Operationen erforderlich, über mehr gespeicherte Prozeduren.

Ich nehme an, es würde lassen sie mehrere Bereiche unterstützen. Zum Beispiel können sie alle Termine zwischen 1.1.2008 und 1.1.2009 UND 1.1.2006 und 1.1.2007 Rückkehr Daten von 2006 bis 2008 Daten zu vergleichen. Sie könnten nicht mit einem einzigen Paar von gebundenen Parametern tun. Auch ich weiß nicht, wie Oracle macht es Abfrage-Plan-Caching für Ansichten ist, aber vielleicht hat es etwas damit zu tun? Mit den Datumsspalten, die als Teil der Ansicht überprüft der Server einen Plan-Cache könnte, die immer die Daten geprüft werden annimmt.

Nur einige Vermutungen werfen hier:)

Auch Sie schreibt:

  

Ich sollte erwähnen, dass sie verwenden   Transaktionen und pro-Client-Schleusen, so   es ist gegen die meisten Gleichzeitigkeit bewacht   Probleme.

Während die gegen Datenkonsistenzprobleme schützen kann aufgrund von Gleichzeitigkeit, es tut weh, wenn es um Performance-Probleme aufgrund Gleichzeitigkeit kommt.

Haben sie auch hinzufügen, eine -im anwendungs- den nächsten eindeutigen Wert für den Primärschlüssel zu generieren?

Es scheint, dass das Konzept der gemeinsamen Staat diese Leute entzieht sich, oder der Grund für den gemeinsamen Staat entzieht sich uns.

Das klingt nach einem ziemlich komisch Algorithmus zu mir. Ich frage mich, wie es Gleichzeitigkeit Griffe - ist es in einer Transaktion eingewickelt?

Für mich klingt wie jemand einfach nicht sicher war, wie ihre WHERE-Klausel schreiben.

Die Ansichten werden wahrscheinlich als temporäre Tabellen verwendet. In SQL Server können wir eine Tabelle Variable oder eine temporäre Tabelle (# / ##) für diesen Zweck verwenden. Obwohl Erstellen von Ansichten von Experten nicht zu empfehlen, habe ich viele von ihnen für meine SSRS Projekte erstellt, weil die Tabellen an dem ich arbeite sie nicht Referenz (Neins FK, im Ernst!). Ich habe Mängel in der Datenbank-Design zu umgehen; das ist, warum ich bin mit Blick auf eine ganze Menge.

Mit dem globalen temporärer Tabelle GTT Ansatz, der Du Kommentar wird hier verwendet wird, ist das Verfahren sicher sicher im Hinblick auf ein Multi-User-System, so dass es kein Problem. Wenn dies Oracle ist, dann würde ich mag überprüfen, dass das System entweder ein angemessenes Maß an Dynamisierung verwendet, so dass der GTT in geeigneter Weise verbunden ist, oder dass ein Aufruf DBMS_STATS wird Statistiken über die GTT zu liefern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top