CTE und temporären index für PostgreSQL
Ich arbeite, postgres-Datenbank, wo ich mit einer Mischung von relationalen Tabellen und jsonb Tabellen (die indiziert werden können).
Ich benutze eine Menge von CTE-Abfragen zum einfügen oder aktualisieren von Daten, die Auswahl aus einer temporären Tabelle, wie:
WITH information as (
select fieldA, fieldB, fieldC from tableA
)
insert (fieldA, fieldB, fieldC)
SELECT inf.fieldA, inf.fieldB, inf.fieldC
from information inf
Gut, ich würde gerne wissen, ob es möglich ist, erstellen Sie temporäre index in dieser Art von Tabellen, und wenn ist, möglich ist, erstellen Sie den index in jsonb Typ fieds auch? (angesichts dieser temporäre Tabellen)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ziemlich sicher, dass es keine Möglichkeit zum erstellen eines Indexes für eine CTE, denn es ist eigentlich nur ein sub-Abfrage, keine Tabelle - es ist nicht dauerhaft im Speicher überall, nur gerollt in der Abfrage-plan, wie gebraucht.
Aber man kann
Create Temp Table information As
statt, dann index, mit sehr wenig Veränderung auf Ihre Fragen.Können Sie auch den index einer Materialisierten Sicht, aber wenn Sie haben temp-Daten darunter, die Schaffung einer anderen temp-Tabelle wahrscheinlich macht am meisten Sinn.
Nein, Sie können nicht erstellen Sie einen index für Teile einer Abfrage, bei der Abfrage.
CTE (common table expressions), wird auch als Subquery Factoring. Das Konzept ermöglicht dem Abfrageoptimierer zu erzeugen, sich den Ausführungsplan für eine komplexe Abfrage, während so dass es zur Verringerung der Wiederholung von sub-queries, indem er ihn in temp-Raum statt erneutes ausführen der gleichen Schritte. Indem es in einer einzigen Abfrage generiert eine große Liste von Schritten, alle ausgeführt als eine regelmäßige Abfrage statt als ein Verfahren. Es kann dort verwendet werden, als eine Ansicht und einen gespeicherten Ausführungsplan in Erinnerung.
Teil der Wahl nicht zu, so dass die Indizierung, die es erfordern würde, einen Aufruf für den index, das wäre dann noch eine re-optimiert für die Haupt-Abfrage, oder schlimmer noch, den Ausführungsplan verlassen würde, Raum zu erraten, auf welchen Schritt ausführen.
Da haben wir schon temp-Tabellen, die indiziert werden können, ich glaube, es hält Sie sauber zu halten, die Indizierung Aktivitäten aus dem Ausführungsplan. Erstellen einer temporären Tabelle, index, dann, wenn Sie die Abfrage ausführen, wird es frisch optimierten Ausführungsplan. Plus die temp-Tabelle kann weiterhin für die Dauer Ihres Verfahrens, die cte-temp-Daten gelöscht, nachdem der Abschluss der Abfrage.
Aber Sie können trotzdem eine temp-Tabelle in eine CTE-also nicht alles oder nichts.