At uddrage mine kommentarer til et svar:indeksopslaget her var meget hurtigt -- al tiden blev brugt på at hente de faktiske rækker. 23 sekunder / 7871 rækker =2,9 millisekunder pr. række, hvilket er rimeligt til at hente data, der er spredt ud over diskundersystemet. Søger er langsomme; du kan a) tilpasse dit datasæt i RAM, b) købe SSD'er eller c) organisere dine data på forhånd for at minimere søgninger.
PostgreSQL 9.2 har en funktion kaldet kun indeksscanninger, der gør det muligt at (normalt) besvare forespørgsler uden at få adgang til tabellen. Du kan kombinere dette med btree
indeksegenskab til automatisk at opretholde orden for at gøre denne forespørgsel hurtig. Du nævner int1
, int2
, og to flydere:
CREATE INDEX sometable_int1_floats_key ON sometable (int1, float1, float2);
CREATE INDEX sometable_int2_floats_key ON sometable (int2, float1, float2);
SELECT float1,float2 FROM sometable WHERE int1=<value>; -- uses int1 index
SELECT float1,float2 FROM sometable WHERE int2=<value>; -- uses int2 index
Bemærk også, at dette ikke på magisk vis sletter disksøgningerne, det flytter dem bare fra forespørgselstidspunkt til indsættelsestidspunkt. Det koster dig også lagerplads, da du kopierer dataene. Alligevel er dette sandsynligvis den afvejning, du ønsker.