Natürlich zwingt mich keiner zu irgend was, der Faktor 25 sollte auch nur den Performanceverlust durch die Tabellen statt Variablen verdeutlichen.
Allerdings würde es mich als Freund von Open Source - Produkten doch schon freuen, wenn diese im Vergleich zu kommerziellen Produkten gut da stehen 
Hintergrund: Ich mache gerade ein studentisches Praktikum und meine Aufgabe ist ein Performance-Vergleich Informix vs. Postgres bzgl. der hier benötigten Datenbankanforderungen. Bisher steht Postgres v.a. in Bezug auf die Performance ausgesprochen gut da … daher verwundert bzw. stört mich dieses Problem doch ein wenig.
Zurück zum Problem:
Also die Funktion selbst ist ja in C geschrieben und liefert ordnungsgemäß die gewünschte Tabelle zurück. Wenn ich die Tabellen (hier t_temp_keys_a u.s.w.) zum zwischenspeichern verwende funktioniert ja auch alles.
Nur wenn ich die Variablen (keys_a, u.s.w.) verwende bekommt die FOR-Schleife nur einen Wert. Daher meine Vermutung das ich bei der Zuweisung der Funktionsrückgabe in die Variable bzw. in der FOR-Schleife einen Fehler habe … auch wenn PG nichts anzeigt.
...
/*
INSERT INTO t_temp_keys_a VALUES (hmGetMatchKeys( 'A', a1, a2, 'A*', dna_a1, dna_a2, pop_id, threshold ));
INSERT INTO t_temp_keys_b VALUES (hmGetMatchKeys( 'B', b1, b2, 'B*', dna_b1, dna_b2, pop_id, threshold ));
INSERT INTO t_temp_keys_dr VALUES (hmGetMatchKeys( 'DR', dr1, dr2, 'DRB1*', drb11, drb12, pop_id, threshold ));
*/
SELECT hmGetMatchKeys( 'A', a1, a2, 'A*', dna_a1, dna_a2, pop_id, threshold ) INTO keys_a;
SELECT hmGetMatchKeys( 'B', b1, b2, 'B*', dna_b1, dna_b2, pop_id, threshold ) INTO keys_b;
SELECT hmGetMatchKeys( 'DR', dr1, dr2, 'DRB1*', drb11, drb12, pop_id, threshold ) INTO keys_dr;
FOR cur_a IN SELECT keys_a LOOP
FOR cur_b IN SELECT keys_b LOOP
cnt := 0;
FOR cur_dr IN SELECT keys_dr LOOP
...