Ik heb een tabel met daarin onder andere 3 integer columns. Nu wil ik snel weten voor welke rijen deze 3 bijelkaar opgeteld groter is dan een bepaalde waarde. De tabel heeft enkele miljoenen rijen. Een straightforward query doet er op een X2 5000+ met 4GB memory en snelle disk zo'n 20 seconden over.
Ik dacht dat het beter zou kunnen en maakte er een expression index voor aan. Voor de netheid maakte ik eerst een procedure aan voor het optellen:
Daarna de index als volgt:
Vervolgens doe ik een query:
Deze werkt perfect. Executie duurt enkele milliseconden. Via explain analyze zie ik dat PG gewoon de aangemaakte index gebruikt.
Doe ik echter de volgende query:
Dan pakt PG ijskoud 60 seconden, en is niet te bewegen om ook maar even te kijken in de index. Nu gebruikt de index een gewone btree en de normale int4_ops. Deze zou gewoon de > operator kunnen gebruiken.
Natuurlijk kan PG soms besluiten om de index niet toe te passen als een seqscan sneller is, maar dat is hiet dus overduidelijk niet het geval. Vacuum, analyze, full, etc, helpt ook niet.
Iemand enig idee?
Ik dacht dat het beter zou kunnen en maakte er een expression index voor aan. Voor de netheid maakte ik eerst een procedure aan voor het optellen:
code:
1
2
3
4
5
6
7
8
| CREATE or REPLACE FUNCTION sum3(integer, integer, integer) RETURNS integer AS $$ DECLARE BEGIN RETURN $1 + $2 + $3; END; $$ LANGUAGE plpgsql IMMUTABLE; |
Daarna de index als volgt:
SQL:
1
| CREATE INDEX table1_sum3test_idx ON table1 (sum3(nr1, nr2, nr3)); |
Vervolgens doe ik een query:
SQL:
1
| select * from table1 where sum3(nr1,nr2,nr3) = 2000; |
Deze werkt perfect. Executie duurt enkele milliseconden. Via explain analyze zie ik dat PG gewoon de aangemaakte index gebruikt.
Doe ik echter de volgende query:
SQL:
1
| select * from table1 where sum3(nr1,nr2,nr3) > 2000; |
Dan pakt PG ijskoud 60 seconden, en is niet te bewegen om ook maar even te kijken in de index. Nu gebruikt de index een gewone btree en de normale int4_ops. Deze zou gewoon de > operator kunnen gebruiken.
Natuurlijk kan PG soms besluiten om de index niet toe te passen als een seqscan sneller is, maar dat is hiet dus overduidelijk niet het geval. Vacuum, analyze, full, etc, helpt ook niet.
Iemand enig idee?
It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.