Autor Beitrag
Oppi35
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Fr 27.01.12 23:12 
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
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 27.01.12 23:27 
Zitat:
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.


Das erstellen des Indexes würde garantiert noch länger dauern als das was du jetzt machst. Wenn SAS indizierte Sichten kennt könntest du einen View für deine Abfrage mit den 10 Mio. Datensätzen erstellen und darauf einen passenden Index legen. Aber wie gesagt einen Index für den Einmalgebrauch wird wohl kaum sinnvoll sein da die Indexerstellung länger dauert als der für eine Abfrage ohne Index notwendige Tablescan.

Für diesen Beitrag haben gedankt: Oppi35
Oppi35 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Sa 28.01.12 00:06 
Bis zu der Auswertung mit den 260 Mio. Datensätzen war ich auch immer dieser Meinung. Allerdings geht, warum auch immer, die Indexerstellung in SAS sehr schnell. In meinen bisherigen Versuchen, war die gemessene Zeit für Abfrage + Indexerstellung wesentlich besser, als ein Tablescan. Was aber sicherlich auch an der riesen Datenmenge liegt.

An indizierte Sichten habe ich auch gedacht, denn im SQL-Server geht es ja; in SAS leider nicht.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 28.01.12 10:38 
Hallo Frank,

kann "SAS" denn T-SQL? Und hast du die Möglichkeit, auf dem Server "Stored Procedures" anzulegen?
Dann wären "TABLE Variablen" (anstatt temp. Tabellen) vllt. eine Möglichkeit, s.a.
Table Variables In T-SQL
sqlserverplanet.com/...ex-on-table-variable

Beachte aber wegen möglichen Performance-Unterschieden www.sql-server-perfo...tables-vs-variables/

P.S. Soll die Abfrage denn nur einmalig erfolgen oder soll diese als Report z.B. täglich bzw. auf Knopfdruck erzeugt werden?