Hallo,

ich habe zwei funktionen die beinahe identisch sind. Ihnen liegen lediglich andere Tabellen zugrunde. Allerding brauch eine der Funktionen erheblich länger als die andere.

Als Ursache für den Zeitunterschied konnte ich auf dieses Statement eingrenzen:

Statement1:
Code:
INSERT INTO dueker.tmp_kblatt_pos ( kalk_art_id, kalk_art, mandantennr, element, element_id, stufe, elementtyp, kalk_menge, mengeneinheit, vorgabezeit, bfrist, gewicht, kblatt_id, fehler, kalk_typ, menge_baukasten, anzahl, mat_ek, mat_gk, mat_gesk, ruest_ek, ruest_gk, ruest_gesk, fert_ek_fix, fert_gk_fix, fert_gesk_fix, fert_ek_var, fert_gk_var, fert_gesk_var, sk_ek_var, sk_gk_var, sk_gesk_var, sk_ek_fix, sk_gk_fix, sk_gesk_fix, lohn_ek, lohn_gk, lohn_gesk) 
SELECT tkalk_art_id, tkalk_art, tmandantennr, '100_113', telement_id, tstufe, telementtyp, cast(tkalk_menge as numeric(16,6)), tmengeneinheit, tvorgabezeit, tbfrist, tgewicht, tkblatt_id, tfehler, tkalk_typ, 3.000000, tanzahl, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.06680000, 0.00000000, 0.06680000, 0.21780000, 0.00000000, 0.21780000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000 
FROM temp_kblatt_pos WHERE telem_sn_id = '(89174,57,0)_(66,7,0)' ORDER BY tvorgabezeit DESC, tbfrist DESC, tgewicht DESC, tkalk_menge DESC LIMIT 1;
explain:
Code:
"Subquery Scan "*SELECT*"  (cost=5.84..5.91 rows=1 width=1010)"
"  ->  Limit  (cost=5.84..5.84 rows=1 width=323)"
"        ->  Sort  (cost=5.84..5.84 rows=1 width=323)"
"              Sort Key: tvorgabezeit, tbfrist, tgewicht, (tkalk_menge)::numeric(16,6)"
"              ->  Index Scan using temp_telem_sn_id_ix on temp_kblatt_pos  (cost=0.00..5.83 rows=1 width=323)"
"                    Index Cond: ((telem_sn_id)::text = '(89174,57,0)_(66,7,0)'::text)"
Statment2:
Code:
INSERT INTO tabelle_2 ( archiv_dat, archiv_kennz, kalk_art_id, kalk_art, mandantennr, element, element_id, stufe, elementtyp, kalk_menge, mengeneinheit, vorgabezeit, bfrist, gewicht, kblatt_id, fehler, kalk_typ, menge_baukasten, anzahl, mat_ek, mat_gk, mat_gesk, ruest_ek, ruest_gk, ruest_gesk, fert_ek_fix, fert_gk_fix, fert_gesk_fix, fert_ek_var, fert_gk_var, fert_gesk_var, sk_ek_var, sk_gk_var, sk_gesk_var, sk_ek_fix, sk_gk_fix, sk_gesk_fix, lohn_ek, lohn_gk, lohn_gesk) 
SELECT tarch_dat, tarch_kennz, tkalk_art_id, tkalk_art, tmandantennr, '100_149', telement_id, tstufe, telementtyp, cast(tkalk_menge as numeric(16,6)), tmengeneinheit, tvorgabezeit, tbfrist, tgewicht, tkblatt_id, tfehler, tkalk_typ, 9.000000, tanzahl, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.03180000, 0.00000000, 0.03180000, 0.11130000, 0.00000000, 0.11130000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000 
FROM temp_kblatt_arch WHERE telem_sn_id = '(502530,57,0)_(1909,7,0)' ORDER BY tvorgabezeit DESC, tbfrist DESC, tgewicht DESC, tkalk_menge DESC LIMIT 1;
explain:
Code:
"Subquery Scan "*SELECT*"  (cost=11.16..11.23 rows=1 width=1065)"
"  ->  Limit  (cost=11.16..11.16 rows=1 width=378)"
"        ->  Sort  (cost=11.16..11.17 rows=3 width=378)"
"              Sort Key: tvorgabezeit, tbfrist, tgewicht, (tkalk_menge)::numeric(16,6)"
"              ->  Bitmap Heap Scan on temp_kblatt_arch  (cost=2.01..11.14 rows=3 width=378)"
"                    Recheck Cond: ((telem_sn_id)::text = '(502530,57,0)_(1909,7,0)'::text)"
"                    ->  Bitmap Index Scan on telem_sn_id_ix  (cost=0.00..2.01 rows=3 width=0)"
"                          Index Cond: ((telem_sn_id)::text = '(502530,57,0)_(1909,7,0)'::text)"
Ich sehe den Unterschied, aber wie kann ich das Problem beheben?