With Data as (Select.....)
Verfasst: Di 10. Apr 2018, 11:23
Hallo,
ich wollte immer schon mal der erste in eine Forum sein ....
Folgende Frage:
ich habe ein Statement nach folgendem Aufbau.
"with Data as ( Select T1.REFID ,Count(*) as REC_ANZAHL from Table1 T1 inner Join Table2 T2 On t1.recid = t2.REFID)
Select t3.RECID, t3.Description, D.REC_ANZAHL
from Table3 T3 left Join Data D on t3.RECID = d.REFID"
Nun das Problem:
Wenn ich das Statement von Data einzeln ausführe bekomme ich ca. 500 Datensätze mit akzeptabler Antwort und prepare- Time
Führe ich das zusammengesetzte Statment aus erhalte ich laut Auswertung von IBExpert eine Ergebnissmenge nach ca. 1,2 Millionen Read-Vorgängen in den von DATA betroffenen Tabellen T1 und T3!! mit Antwort-Zeiten die nicht wirklich gut sind.
Nach meine (Un-)Wissensstand ist das With Statement quasi wie eine Temp-Table zu verstehen.
Will sagen: Das Select für Data wird einmal ausgeführt und mit den folgenden Statments gejoint.
Das o.g. Bespiel kann mann durch aufeinanderfolgende Joins natürlich abbilden.
Was ist jedoch mit Views und Selectable Stored Procedures? ( deren Ergebnismengen haben m.E. keine Indizes und müssten dann über komplette Tabellenscans gejoint werden.
z.B.:
"with Data as ( Select P1.REFID ,P1.REC_ANZAHL From PRC_SELECT_DATA_FROM T1_T3)
Select t3.RECID, t3.Description, d.REC_ANZAHL
from Table3 T3 left Join Data D on t3.RECID = d.REFID"
nutzt man temporäre Tabellen, so stellt sich sofort das erwartete Verhalten ein.
Das ist dann natürlich immer 2-schrittig (Sql1 in TMP-Tabelle einfügen / Sql-Statement mit Join ausführen) und führt dann auch noch zu vielen temporären Tabellen
hat da schon jemand tiefere Erkenntnis zu dieser Aufgabenstellung/ Serververhalten?
( ich weis ist sehr theoretisch, aber vielleicht ist ja schon jemand über so ein Problem gestolpert
)
Mit freundlichen Grüßen
Martin Kerkhoff
decon-it
ich wollte immer schon mal der erste in eine Forum sein ....
Folgende Frage:
ich habe ein Statement nach folgendem Aufbau.
"with Data as ( Select T1.REFID ,Count(*) as REC_ANZAHL from Table1 T1 inner Join Table2 T2 On t1.recid = t2.REFID)
Select t3.RECID, t3.Description, D.REC_ANZAHL
from Table3 T3 left Join Data D on t3.RECID = d.REFID"
Nun das Problem:
Wenn ich das Statement von Data einzeln ausführe bekomme ich ca. 500 Datensätze mit akzeptabler Antwort und prepare- Time
Führe ich das zusammengesetzte Statment aus erhalte ich laut Auswertung von IBExpert eine Ergebnissmenge nach ca. 1,2 Millionen Read-Vorgängen in den von DATA betroffenen Tabellen T1 und T3!! mit Antwort-Zeiten die nicht wirklich gut sind.
Nach meine (Un-)Wissensstand ist das With Statement quasi wie eine Temp-Table zu verstehen.
Will sagen: Das Select für Data wird einmal ausgeführt und mit den folgenden Statments gejoint.
Das o.g. Bespiel kann mann durch aufeinanderfolgende Joins natürlich abbilden.
Was ist jedoch mit Views und Selectable Stored Procedures? ( deren Ergebnismengen haben m.E. keine Indizes und müssten dann über komplette Tabellenscans gejoint werden.
z.B.:
"with Data as ( Select P1.REFID ,P1.REC_ANZAHL From PRC_SELECT_DATA_FROM T1_T3)
Select t3.RECID, t3.Description, d.REC_ANZAHL
from Table3 T3 left Join Data D on t3.RECID = d.REFID"
nutzt man temporäre Tabellen, so stellt sich sofort das erwartete Verhalten ein.
Das ist dann natürlich immer 2-schrittig (Sql1 in TMP-Tabelle einfügen / Sql-Statement mit Join ausführen) und führt dann auch noch zu vielen temporären Tabellen

hat da schon jemand tiefere Erkenntnis zu dieser Aufgabenstellung/ Serververhalten?
( ich weis ist sehr theoretisch, aber vielleicht ist ja schon jemand über so ein Problem gestolpert

Mit freundlichen Grüßen
Martin Kerkhoff
decon-it