Tôi hiện đang cố gắng tối ưu hóa chế độ xem, không phải do tôi viết. Nó thực sự phức tạp, với nhiều lượt xem sử dụng chức năng sử dụng chế độ xem và v.v. Vì vậy, chơi đùa với những gì tôi có thể tối ưu hóa tôi có một cái gì đó tôi có thể không thực sự hiểu: tôi có chức năng này:SUM chậm hơn vòng lặp
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;
tôi chỉ nghĩ: vòng là xấu, bạn có thể làm tương tự với số tiền:
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;
Điều lạ lùng là nó thực sự chậm hơn, theo hệ số ~ 2. Không sum
chỉ không thích các chức năng? Ai đó có thể giải thích điều này?
Chỉnh sửa: Đây là một câu hỏi lý thuyết. Giải pháp rõ ràng là: tránh sử dụng các chức năng (mà tôi chủ yếu làm, khi tôi tối ưu hóa quan điểm, người khác viết), điều tôi đã làm, nhưng tôi nghĩ, câu hỏi vẫn còn thú vị.
Cách bạn tìm 'tổng hợp' chậm hơn' vòng lặp'. bạn có sử dụng bất kỳ 'DBMS_PROFILER' nào không. đăng kết quả sẽ hữu ích khi tìm giải pháp – Exhausted
Chưa sử dụng DBMS_Profiler. Tôi thực hiện một vòng lặp, mà gọi các chức năng trong bối cảnh tôi cần nó (hơn 8000 lần) mã đầu tiên mất 4-6 giây, thứ hai mất 11-14. –
@ user2179887. . . Hai đoạn mã không tương đương. Đầu tiên là gọi hàm 'verrechnung.get_betrag()' hai lần cho mỗi hàng; thứ hai chỉ gọi nó một lần. Sử dụng cùng một biểu thức trong cả hai, và tôi đoán bạn sẽ thấy rằng 'sum()' là nhanh hơn. –