Hallo Zusammen,
ich habe die Aufgabe aus einer Datenbanktabelle mit 260 Mio.!!! Datensätzen, Daten auszulesen. Auf der "eindeutigen" Spalte liegt ein Index.
In meiner Abfrage muss ich allerdings nicht nur die indexierte Spalte mit der where-Klausel anfassen.
Ich habe mir gedacht, ich grenze das ganze vorab ein. Also habe ich in der where-Klausel nur die indexierte Spalte aufgeführt, was zur Folge hatte, dass noch 10 Mio. Datensätze übrig bleiben.
Zeit für die Abfrage: Echtzeit=26 Minuten / CPU Zeit: 16 Minuten
Auf diese Tabelle habe ich dann die benötigten Indizes gelegt und weitere Abfragen erstellt. Diese liefen dann auch alle superschnell.
Ich denke, das Hauptproblem ist, dass das Schreiben der 10 Mio. Datensätze extrem viel Zeit in Anspruch nimmt. Und eigentlich brauch ich diese 10 Mio. Datensätze ja auch nur für die Folgeabfrage, also nicht physisch.
Da ich das Zwischenergebnis nicht physiche benötige, habe ich es mit einer geschachtelten Abfrage probiert.
Bsp:
Select *
From (Select * From Abfrage1)
Where ...
Das ganze funkioniert natürlich, aber nach 45 Minuten habe ich abgebrochen.
Problem hierbei ist jetzt, dass ich auf das Zwischenergebnis der inneren Abfrage keinen Index erstellen kann. Zumindest ist mir nicht bekannt wie.
Mein Frage ist also:
Gibt es eine Möglichkeit eine Art „Index zur Abfragezeit“ zu erstellen. Dann bräuchte ich die Daten nicht zwischenspeichern und hätte die Vorteile eines Indizes.
Übrigens eine Erweiterung der Indizes auf die abzufragende Haupttabelle besteht nicht. Es handelt sich hier um eine Datenbank, auf die das ganze Unternehmen unterschiedliche Abfrage erstellt.
Das ganze läuft im Datenbanksystem „SAS“, dass auch eine Art SQL als Abfragesprache verwendet. Die Antwort muss sich aber nicht direkt auf SAS beziehen. Wenn jemand die Antwort hat, wie die Abfrage im SQL-Server sinnvoll gelöst wird, reicht mir das völlig:)
Vielen Dank schonmal vorab fürs Lesen (für die, die bis hierher gekommen sind:)
Frank