나는 25mln 행 테이블에서 각 행을 가져 와서 이전 행과 비교하는 매우 간단한 plpgsql 함수를 작성합니다. 2 개의 형제 행이 같은 열 "AOGUID"
인 경우, 그것들이 리턴됩니다. 내가 알고있는 것처럼이유가 무엇입니까 <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"
불행하게도 일반 쿼리 시간 가까운 시간에 실행해야합니다. 일반 쿼리는 한 시간 만에 실행되지만 함수는 80 시간 내에 실행됩니다!
plpgsql 함수가 일반 쿼리보다 훨씬 느리게 실행되는 이유와 성능을 어떻게 향상시킬 수 있는지 설명 할 수 있습니까?
PS :
explain SELECT "AOGUID" FROM "Zemla" ORDER BY "AOGUID"
가 Zemla "인덱스에서만 zemla_aoguid_not_unique를 사용하여 스캔", " 비용 (= 0.56..3336281.02 행 = 25,852,488 폭 = 37)"
관련 없음 - 창 기능을 사용하지 않는 이유는 무엇입니까? 예를 들어'lag' 또는'lead? '에 대해서 .. –
일반 SQL로 할 수 있다면 for 루프 (또는 PL/pgSQL)를 사용하지 마십시오. –
@a_horse_with_no_name : [절대로 말하지 마십시오.] (http://dba.stackexchange.com/questions/166374/grouping-or-window/166397#166397)이 경험 법칙은 예외입니다. –