Schrift
[thread]3572[/thread]

PostgreSQL Performance Probleme



<< >> 4 Einträge, 1 Seite
Andreas
 2005-05-20 13:13
#33272 #33272
User since
2003-09-24
111 Artikel
BenutzerIn
[default_avatar]
Hallo an alle,
ich habe eine Tabelle die 22 Spalten beinhaltet und 5000 Datensätze stark ist.
Unter anderem gibt es in dieer Tabelle eine Spaltze die sich auftrag nennt und eine datums Spalte.

Jetzt zum Problem:
Mache ich eine Abfrage mit einer where clausel auf den auftrag geht alles superschnell.
Beinhaltet die Abfrage nur das datum (z.B. Datumsbereich) geht das ganze furchtbar langsam.

Jetzt wirds seltsam:
Beinhaltet die Abfrage das Datum und den Auftrag geht es schnell??

Also:
Select * FROM TABELLE WHERE auftrag LIKE '4%' --> schnell

Select * FROM TABELLE WHERE auftrag LIKE '4%' AND datum BETWEEN '2005-05-01' AND '2005-05-10' --> schnell

Select * FROM TABELLE WHERE datum BETWEEN '2005-05-01' AND '2005-05-10' --> langsam

Hat jemand eine Idee wie ich das Problem lösen kann , INDEX oder sowas?

Danke schon mal

Andreas
Taulmarill
 2005-05-20 13:18
#33273 #33273
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
du könntest das datumsfeld indexieren, ob das was bringt, kann ich dir aber nicht sagen.
die erklärung für das verhalten ist, dass du bei der zweiten abfrage die datenmenge mit dem LIKE schon verkleinert hast, daher warscheinlich wesendlich weniger datumsfelder überprüft werden müssen. ist das datumsfeld denn auch dem postgres als datumswert bekannt, oder ist das nur ein string? letzteres währe wohl wesendlich langsamer.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2005-05-23 15:16
#33274 #33274
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Vielleicht hilft es auch, wenn Du nicht * scheibst, es sei denn, Du brauchst wirklich alle Felder.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2005-05-23 18:52
#33275 #33275
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
setze mal einen index auf die spalte datum und teste, ob das genug bringt

falls nicht, kann es vielleicht was helfen, wenn du z.B. das jahr in eine eigene spalte auslagerst, und vielleicht genauso den monat, dann kannst du die datenmenge, auf die das between ausgefuehrt wird, mit: where jahr=2004 and (monat=12 or monat=11) oder aehnlich verkleinern, was das ganze beschleunigen muesste; dafuer handelst du dir bei insert/updates mehr arbeit ein. vielleicht kann man die befuellung dieser beiden spalten durch einen trigger vornehmen, aber das kostet auch laufzeit; du musst halt abschaetzen, was dir wichtiger ist.

wenn gewisse bereiche haeufiger benoetigt werden (z.B. vom 1. d. Monats bis zum letzten tag), kann es auch helfen, fuer diese bereiche verschiedene views anzulegen und dann die abfrage gegen den view richten. ich kann dir aber nicht sagen, ob du dadurch was gewinnst und wieviel, weil ich mich mit postgre nicht besonders gut auskenne und deine Daten nicht kenne
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 4 Einträge, 1 Seite



View all threads created 2005-05-20 13:13.