# Daten schneller aus einer DB auslesen



## Generic1 (12. Sep 2008)

Hallo,

ich habe folgende Schwierigkeit und zwar habe ich eine menge von Daten in meiner Datenbank (um die 3 Mill) welche geordnet nach einem Timestamp in der Datenbank gespeichert sind,

meine Frage wäre nun, wie ich das lesen aus der Datenbank schneller machen kann, meine bedenken sind, dass ich immer alle 3 Mill Datensätze durchlaufen muss obwohl ich vielleicht nur die Daten von 10-10-2003 bis 11- 03-2005 benötige,

Gibt es irgend eine Möglichkeit, die Abfrage schneller zu machen?

schönes Wochenende,

lg


----------



## SlaterB (12. Sep 2008)

select * from .. where time > 10-10-2003  and time < 11- 03-2005
+ evtl. Index auf der Zeit in der DB benötigt


----------



## Gast (12. Sep 2008)

Mit BETWEEN geht's auch.
Oder >, >=, <, <=, je nach Bedarf.


----------



## Generic1 (12. Sep 2008)

SlaterB hat gesagt.:
			
		

> select * from .. where time > 10-10-2003  and time < 11- 03-2005
> + evtl. Index auf der Zeit in der DB benötigt




das ist schon klar, so mach ichs eh, aber es müssen trotzdem alle Dupel angesehen werden und das möchte ich vermeiden um zeit zu sparen, Mir gehts rein um das Sparen von Zeit, 
gibts da irgendwas?


----------



## SlaterB (12. Sep 2008)

mit einem Index müssen nicht alle angesehen werden,

noch ein bisschen läßt es sich vielleicht tunen, wenn du alternativ/ parallel zu den Dates einfache int-Werte einfügst 
(Tag 17, Tag 18, .., ab besten individuelle Werte wie Zeitraum 1, 2, 3 statt Begin + Ende),
vielleicht sind die ja von der DB schneller zu verarbeiten,

aber im Allgemeinen wird die hoffentlich auch mit Dates sehr effizient umgehen

(naja, ich erzähl grad nur ein bisschen, zur DB-Optimierung nicht auf mich hören  )


----------



## robertpic71 (12. Sep 2008)

Das Wichtigste wurde eh schon mehrmals erwähnt: Über das Datums bzw. Timestampfeld sollte ein Index liegen.

Weiters sollte dein Vergleichsparameter als (Datenbanktyp) Datum vorliegen, als z.B. Date('2005-10-10'). Ich hatte mal vor Jahren genau diesen unerwünschten Effekt, dass die DB meinte, die ganze Tabelle lesen zu müssen, damit das Datum als Zeichenkette verglichen werden kann. Am besten man arbeitet mit einem preparedStatement um solchen Problemen aus dem Weg zu gehen.

Bei komplexen Select's passiert mir das bei Datenbanken aller Preisklassen, dass ein "Fulltablescan" angeworfen wird.

/Robert


----------



## Generic1 (12. Sep 2008)

HAllo

> Weiters sollte dein Vergleichsparameter als (Datenbanktyp) Datum vorliegen, als z.B. Date('2005-10-10')

das verstehe ich nicht ganz, ich hab in meinen Tabellen eine Timestamp- Spalte und die Abfrage geht wie oben beschrieben "... zeitstempel Between 'zeit1' And 'zeit2'


----------



## robertpic71 (12. Sep 2008)

Generic1 hat gesagt.:
			
		

> das verstehe ich nicht ganz, ich hab in meinen Tabellen eine Timestamp- Spalte und die Abfrage geht wie oben beschrieben "... zeitstempel Between 'zeit1' And 'zeit2'



Ich bin jetzt vom schlimmsten anzunehmenden SQL-Parser ausgegangen, du hast ja keine Datenbank angegeben.

Es hängt davon ab, wie "schlau" die Datenbank bzw. der Parser ist. Wenn er die Konstante 'zeit1' als Timestamp erkennt und zum Starten in den Index verwendet ist alles im grünen Bereich. Wenn der aber meint 'zeit1' ist eine Stringkonstante, dann die komplette Tabelle liest um für jeden Satz den Timestamp (für den Vergleich) in eine Zeichenkette  umwandelt, hast du genau das, was du nicht wolltest.

Ich gehe davon aus, dass die meisten Parser das jetzt checken. Aber ich hatte vor ein paar Jahren genau diese konkrete Problem (bin mir mit der Datenbank nicht mehr sicher).

Den Unterschied solltest du eigentlich sofort merken. Wenn man z.B. nur einen Tag (mit wenigen Sätzen)  rausholt, dürfte das nur im Zehntelsekundenbereich (auf Serverhardware) liegen, wenn die Datenbank mit einem Index arbeitet. 

/Robert


----------



## Generic1 (12. Sep 2008)

ich verwende Firebird aber was haltet ihr eigentlich von der JavaDB, ist die um viel langsamer als eine andere DB oder liegt die Performance ok? (Java DB is ja glaub ich zur gänze in Java geschrieben)


----------



## geraldf (12. Sep 2008)

Wenn du die obigen Tipps berücksichtigst, sollte jeder DB-Server schnell genug sein.

Gut sollte es z. B. mit MySQL funktionieren. Am Schnellsten mit der MyISAM-Engine.

Betr. Derby ... weiß ich nicht.

Beste Grüße
Gerald


----------

