Obecnie próbuję zoptymalizować widok, który nie został napisany przeze mnie. To jest naprawdę skomplikowane, z wieloma widokami za pomocą funkcji wykorzystującej widoki i tak dalej. Tak, zabawy z co mogę zoptymalizować mam coś naprawdę nie mogę zrozumieć: mam tej funkcji:SUMA jest wolniejsza od pętli
create or replace FUNCTION at_get_tourenrechnungssumme_br (in_rechnr IN rechnungen.rechnr%TYPE)
RETURN NUMBER
IS
CURSOR c1 (
int_rechnr IN rechnungen.rechnr%TYPE)
IS
SELECT (ROUND (
verrechnung.get_betrag (bt.buchid, bt.betrag_euro)*(1+b.mwst/100),
2))
betrag
FROM buchungen_touren bt, v_buchkz b
WHERE bt.rechnr = int_rechnr
AND bt.storniert_jn = 0
AND bt.buchid = b.ID;
int_return NUMBER (11, 2) := 0;
BEGIN
FOR c1_rec IN c1 (in_rechnr)
LOOP
int_return := (int_return + c1_rec.betrag);
END LOOP;
RETURN NVL (int_return, 0);
END at_get_tourenrechnungssumme_br;
Pomyślałem: pętle są złe, można zrobić to samo z sumy:
create or replace FUNCTION at_get_tourenrechnungssumme_br (in_rechnr IN rechnungen.rechnr%TYPE)
RETURN NUMBER
IS
int_return NUMBER (11, 2) := 0;
BEGIN
SELECT sum(ROUND (
verrechnung.get_betrag (bt.buchid, bt.betrag_euro)*(1+b.mwst/100),
2))
betrag
into int_return
FROM buchungen_touren bt, v_buchkz b
WHERE bt.rechnr = in_rechnr
AND bt.storniert_jn = 0
AND bt.buchid = b.ID;
RETURN NVL (int_return, 0);
END at_get_tourenrechnungssumme_br;
Dziwne jest to, że w rzeczywistości jest wolniejsze, o współczynnik ~ 2. Czy sum
po prostu nie lubię funkcji? Czy ktoś może to wyjaśnić?
Edytuj: To jest bardziej teoretyczne pytanie. Oczywistym rozwiązaniem jest: unikać używania funkcji (co robię głównie, gdy optymalizuję poglądy, napisał ktoś inny), co zrobiłem, ale myślę, że pytanie wciąż jest interesujące.
Jak znaleźć 'sum' jest wolniejsze niż' loop'. używasz dowolnego 'DBMS_PROFILER'. zaksięgowanie wyniku będzie pomocne w znalezieniu rozwiązania – Exhausted
Nie korzystałem jeszcze z DBMS_Profiler. Zrobiłem pętlę, która wywołuje funkcję w kontekście, którego potrzebuję (ponad 8000 razy), pierwszy kod zajmuje 4-6 sekund, drugi zajmuje 11-14. –
@ user2179887. . . Dwa fragmenty kodu nie są równoważne. Pierwszym jest wywołanie funkcji 'verrechnung.get_betrag()' dwukrotnie dla każdego wiersza; drugi nazywa go tylko raz. Użyj tego samego wyrażenia w obu, a domyślam się, że 'sum()' jest szybsze. –