私は非常に単純なplpgsql関数を書いています。これは25mlnの行テーブルから各行を取り出し、前の行と比較します。 2つの兄弟行に等しい場合は、"AOGUID"
列が返されます。私はそれを理解したようなぜFOR <query> LOOPは基本クエリよりもはるかに遅いですか?
CREATE or replace FUNCTION get_duplicate_zemli() RETURNS setof character varying AS $$
DECLARE
each_zemla character varying;
prev_zemla character varying;
BEGIN
FOR each_zemla IN SELECT "AOGUID" FROM "Zemla" ORDER BY "AOGUID" LOOP
if (prev_zemla = each_zemla) then
return next each_zemla;
end if;
prev_zemla:= each_zemla;
END LOOP;
END;
$$ LANGUAGE plpgsql;
、この機能は私にとって、これは真実ではありません
SELECT "AOGUID" FROM "Zemla" ORDER BY "AOGUID"
残念ながら、プレーンクエリ時間に近い時間で実行する必要があります。プレーンクエリは1時間で実行されますが、関数は80時間で実行されます。
plpgsql関数がプレーンなクエリよりもずっと遅く実行される理由と、パフォーマンスをどのように向上させることができるのかを誰でも説明できますか?
PS:
explain SELECT "AOGUID" FROM "Zemla" ORDER BY "AOGUID"
Zemla " (コスト= 0.56..3336281.02行= 25852488幅= 37) "" インデックスのみにzemla_aoguid_not_uniqueを使用してスキャンする"
- なぜウィンドウ関数を使用しないのですか? –
プレーンSQLで行うことができれば、forループ(またはPL/pgSQL)を使用しないでください。 –
@a_horse_with_no_name:[決して言わないでください](http://dba.stackexchange.com/questions/166374/grouping-or-window/166397#166397)この経験則には例外があります。 –