
Zitat von
akretschmer
Ich glaube, du tust da etwas massiv überbewerten. Wenn Du in der DB Performance-Probleme hast, dann kann das an vielen Dingen liegen, aber sehr unwahrscheinlich an der Wahl des Encodings.
Andreas
Was heisst jetzt massiv überbewerten. Hier mal die Zahlen zum Vergleich:
Code:
show LC_COLLATE
=> "de_DE"
explain analyze select * from person where nachname like 'Bö%'
"Seq Scan on person (cost=0.00..3264.69 rows=399 width=570) (actual time=0.219..258.915 rows=24 loops=1)"
" Filter: ((nachname)::text ~~ 'Bö%'::text)"
"Total runtime: 259.178 ms"
Code:
show LC_COLLATE
=> "C"
explain analyze select * from person where nachname like 'Bö%'
"Bitmap Heap Scan on person (cost=5.39..1034.79 rows=399 width=570) (actual time=0.177..0.339 rows=24 loops=1)"
" Filter: ((nachname)::text ~~ 'Bö%'::text)"
" -> Bitmap Index Scan on index_person_on_nachname (cost=0.00..5.39 rows=399 width=0) (actual time=0.124..0.124 rows=24 loops=1)"
" Index Cond: (((nachname)::text >= 'Bö'::character varying) AND ((nachname)::text < 'B÷'::character varying))"
"Total runtime: 0.571 ms"
Das ist jetzt eine Abfrage über eine kleine Tabelle mit ~80000 Datensätzen.
Man nenne mich kleinkarriert oder überbewertet, aber eine Laufzeit von 0,571 ms : 259,178 ms finde ich bei so einer kleinen Tabelle schon mehr als deutlich. Was dann bei grossen Tabellen passiert sollte wohl klar sein.
Fällt das immer noch unter überbewertet, oder wie seht ihr das mit den Zahlen so? Das Problem ist eben dass der Index nicht genutzt wird sobald LC_LOCATE eben auf de_DE steht.
Wenn das Problem ja über die in der Doku beschriebenen Operator Classes in den Griff zu bekommen wäre, wäre das ja mal ok. Allerdings weiss ich da nicht so genau wie das anzuwenden wäre.
Interessiert ich aber jetzt mal aufjedenfall was ihr zu den Zahlen sagt.
Gruß
Lesezeichen