Clientseitiges Cachen von SQL Resultsets

Hi,

ich entwickle gerade eine Applikation die mehrmals die gleiche performance kritische SELECT Abfrage ausführt um im folgenden durch unterschiedliche INNER JOINS die eigentlichen Resultate zu liefern. Nun möchte ich dieses kritische SELECT nicht ständig ausführen müssen, wenn ich im vorraus sagen kann, dass es immer das gleiche Resultat zurück liefert.

Wie kann ich ein Resultat eines SQL Statments clientseitig cachen?

Ist es möglich das Resultat als String darzustellen um dieses in kommenden SELECTs wieder zuverwenden? z.B.:
SELECT * FROM table2 INNER JOIN ( (1 AS id, 11 AS val), (2 AS id, 22 AS val) ) AS table1 ON table2.t1_id=table1.id


Cheers,
niqn

Ich würde sagen, das ist von deiner Programmiersprache und ev. vorhandenen Frameworks abhängig, nicht von der Datenbank.

Leider schweigst du dich komplett aus, was du dort verwendest.

Als DB nutze ich PostgreSQL und entwickle in Python.

Gerade bin ich auf memcache gestossen. Bin mir aber noch nicht ganz im klaren ob ich o.g. damit erschlagen kann.

Ja, kannst du.
Das ist allerdings eine Python-Frage und keine PostgreSQL-Frage.

Siehe ads, ist Sache des Clients.


Ist es möglich das Resultat als String darzustellen um dieses in kommenden SELECTs wieder zuverwenden? z.B.:
SELECT * FROM table2 INNER JOIN ( (1 AS id, 11 AS val), (2 AS id, 22 AS val) ) AS table1 ON table2.t1_id=table1.id


Cheers,
niqn

Sicher, wenn gültiges SQL bei rauskommt. Aber warum baust Du Dir nicht eine temp. Tabelle, die Du dann weiternutzt?


Andreas

Sicher, wenn gültiges SQL bei rauskommt. Aber warum baust Du Dir nicht eine temp. Tabelle, die Du dann weiternutzt?

Meine Frage war eigentlich, wie fasse ich ein Resultset in gültiges SQL um eben dies zu realisieren.
Die temporäre Tabelle wäre natürlich eine Möglichkeit, allerdings geht es mir um Geschwindigkeit und dachte eben, dass es schneller sei den resultset im RAM zu halten als neue SQL-Queries starten zu müssen.

Indem Du auf den Client aus dem Result-Set einen neuen SQL-Befehl frickelst. Stringfunktionen und so, you know?

Die temporäre Tabelle wäre natürlich eine Möglichkeit, allerdings geht es mir um Geschwindigkeit und dachte eben, dass es schneller sei den resultset im RAM zu halten als neue SQL-Queries starten zu müssen.

Wie groß sind die temp. Tabellen denn? Und neue SQL-Queries willst Du doch sowieso starten, oder hab ich da was flasch verstanden?


Wenn groß, dann mußt Du diese ja vom Server zum Client tragen, dort frickeln (Stringfunktionen, siehe oben) und zurück schicken für die nächste Abfrage. Diese wird, also das SQL, sicherlich auch sehr groß. Dieses große SQL ist vom Server (Planner) auszuwerten. Und so weiter. Kostet alles Performance. Mit einer fertigen Tabelle (die bei mehrmaligen Gebrauch vielleicht sogar im RAM des Servers liegt) sparst Du Dir eine Menge Aufwand (Traffic, Analyse, …)



Andreas

Temptable ist eine sehr geeignete Lösung für Dein Problem … und auch nicht langsam - ganz im Gegentum … bei kleinen Zwischenergebnissen wird das sich sowieso praktisch nur im Ram abspielen (Cache).

Außerdem spielt sich alles da ab, wo es hingehört - auf dem Server

du berechnest das zwischenergbenis mit einem
INSERT INTO … SELECT
bzw.
SELECT INTO

da muss nichts zum Client uebertragen werden - dich interessiert das ergebnis ja warhscheinlich bis dahin auch wenig