Frage

Ich habe durch Datum und Silber abgeschöpft, aber kann nicht scheinen, Antworten von mir auf diese speziellen Fragen zu finden.

  1. Wenn zwei Datenbankbenutzer eine Abfrage - sagen wir, 'select * from AVERYBIGTABLE;' - wo würden die Ergebnisse der Abfrage im Allgemeinen gespeichert bekommen ... das heißt, unabhängig von der Größe der Ergebnismenge

    a. In der OS-verwalteten physikalischen / virtuellen Speicher des DBMS-Server?

    b. In einer DBMS-Managed temporären Datei?

  2. Ist das Abfrageergebnis pro Verbindung aufrechterhalten?

  3. Wenn das Abfrageergebnis in der Tat pro Verbindung aufrechterhalten wird, was dann, wenn es Connection-Pooling in-Effekt (durch eine Schicht von Code über dem DBMS sitzend)? Wird nicht, dann kann die Ergebnismenge pro Abfrage erhalten (statt pro Verbindung)?

  4. Wenn die Datenbank in Echtzeit verändert sich während seiner Benutzer gleichzeitig Auswahlabfragen ausgeben, was auf die Anfragen geschieht, die bereits ausgeführt wurden, aber noch nicht (vollständig) durch die Abfrage der Emittenten verbraucht '? Zum Beispiel sei angenommen die Ergebnismenge 50.000 Zeilen hat; der Benutzer gerade bei 100. Iterieren, wenn parallel ein anderer Benutzer einen Einsatz ausführt / löschen, so dass es zu mehr / weniger als 50.000 Zeilen führen würde, wenn die frühere Abfrage von jedem Benutzer des DBMS neu ausgestellt werden sollten?

  5. Auf der anderen Seite, im Fall einer Datenbank, die in Echtzeit nicht ausgeben, Benutzer jeweils mit Sätzen identisch, aber sehr großen Ergebnis identische Abfragen, wenn 2 ändern, würde die DBMS 2 identische Kopien der Ergebnismenge halten, oder wäre es eine einzige gemeinsame Kopie hat?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ein Teil davon kann spezifisch für Oracle sein.

  1. Die vollständigen Ergebnisse der Abfrage muss nicht jeder Benutzer erhält einen Cursor kopiert (wie ein Zeiger), die unterhält, welche Zeilen abgerufen wurden, und welche Zeilen müssen noch geholt werden. Die Datenbank wird so viel von Daten zwischenspeichern, wie es kann, wie es die Daten aus den Tabellen liest. Gleiche Prinzip wie zwei Benutzer nur den Griff Datei Datei gelesen haben.

  2. Die Cursor pro Verbindung gehalten werden, können die Daten für die nächste Zeile oder nicht bereits im Speicher sein können.

  3. Verbindungen zum größten Teil sind Single-Threaded, nur 1 Client kann eine Verbindung zu einem Zeitpunkt verwenden. Wenn die gleiche Abfrage zweimal auf derselben Verbindung ausgeführt wird, dann wird die Cursorposition zurückgesetzt wird.

  4. Wenn ein Cursor auf dem Tisch geöffnet ist, die dann aktualisiert wird, die alten Zeilen in einen separaten Raum kopiert werden (Undo in Oracle) und ist für die gesamte Lebensdauer des Cursors beibehalten, oder zumindest, bis es läuft aus Raum, den es zu halten. (Oracle wird eine Momentaufnahme zu alt Fehler geben)

  5. Die Datenbank wird nie im Cache gespeicherten Daten vervielfältigen, falls Oracle mit Cursor teilen nur ein einziger Cache gespeicherten Cursor und jeder Client Cursor würde es müßte seine Position im Cache gespeicherten Cursor halten.

Oracle Database Concepts

Siehe 8 Speicher für Fragen 1, 2, 5

Siehe 13 Daten Concurrency und Konsistenz (Fragen 3, 4)

Andere Tipps

Der Grund, warum Sie tun dies nicht in Datum usw. finden, weil sie zwischen DBMS-Produkten ändern könnten, gibt es nichts in der relationalen Modell Theorie über Verbindungen zur Datenbank oder wie die Bündelung der Ergebnismengen aus einer Abfrage zu erhalten (wie Caching usw). Der einzige Punkt, der teilweise abgedeckt ist. 4 - wo der Lesepegel ins Spiel (zB lesen uncommitted) kommen würde, aber dies gilt nur, bis die Ergebnismenge erzeugt worden

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