Optymalizacja zapytania Oracle

0

Witam, mam problem ze zmuszeniem Oracle do zwrócenia wyników selecta:

select
t1.k1, t1.k2,
t2.k1, t2.k2
from
(select k1, k2 from A) t1, -- S1
(select k1, k2 from B) t2 -- S2
where
t1.k1 = t2.k1

O ile samo S1 wykonuje się ok 5 sek, "A" jest ogromnym widokiem, S2 tak samo, wraca po ok 5 sek, o tyle wszystko razem za chiny nie chce się wykonać w skończonym czasie.
Chcę "zmusić" Oracle do wykonania S1, S2 i połączenia wszystkiego na samym końcu.
I S1 i S2 zwracają po 15 - 20 wierszy, więc teoretycznie powinno być migiem, a tu zonk.
Jak przerobić, żeby ruszyło ?

0

z sql jestem noga (uczę się), ale możesz mi wyjaśnić co zyskujesz tymi wewnętrznymi select-ami (S1, S2)?
Jak dla mnie oba "select k1, k2 from" są zupełnie zbędne.

0

@MarekR22 przypuszczam, że to bardzo uproszczona wersja zapytania.
@Vitec pokaż plan zapytania

0
MarekR22 napisał(a):

z sql jestem noga (uczę się), ale możesz mi wyjaśnić co zyskujesz tymi wewnętrznymi select-ami (S1, S2)?
Jak dla mnie oba "select k1, k2 from" są zupełnie zbędne.

Pewnie że tak. Nic nie wnoszą poza przejrzystością zapytania

0

@MarekR22
SELECT
NR_MCA,
ODDZIAL_N,
WYDATKI_POSR_S,
WARTOSC.BZ_S,
KLUCZ_BZ_S,
WART_KLUCZA,
SALDO_MA NARZUT_WYD
FROM
(SELECT
NR_MCA,
MIESIAC,
ODDZIAL_S,
ODDZIAL_N,
BZ_S,
WYDATKI_POSR_S,
sum (wn) SALDO_WN,
sum (ma) SALDO_MA
FROM
VW_1
WHERE
symbol_dok like '__BZ-172'
AND nr_mca = 12
AND syntetyka = 160
AND oddzial_s = '03'
group by
nr_mca,
miesiac,
oddzial_s,
oddzial_n,
BZ_S,
wydatki_posr_s
) WARTOSC, --s1
(SELECT
klucz_bz_s,
BZ_S,
wn WART_KLUCZA
FROM
VW_2
WHERE
klucz_bz_s = '03'
AND nr_mca = 12
AND oddzial_s = '03'
)KLUCZ --s2
WHERE
WARTOSC.BZ_S = KLUCZ.BZ_S

Plan by się nie zmieścił z uwagi na zawartosc vw_1 i vw_2

0

Przejrzystością zapytania? :| Zapytanie ma być wydajne, a dopiero potem ewentualnie przejrzyste.

0

Hmm. w explainpanie mam "select statement REMOTE" co to znaczy ?

0

Patrzę i nie rozumiem po co te selecty. Ja w ramach próby optymalizacji spróbowałbym(nie jest to kolejność kroków a raczej warianty do sprawdzenia):

  1. Uprościł wewnętrzne select bo wyciągasz w nich kolumny, które nie są potrzebne.
  2. Zmienił zapytanie na wersję używającą JOIN.
  3. Sprawdził jakie są założone indeksy i czy czasem jakiegoś nie brakuje.
  4. Dodatkowo Oracle jak każda baza ma swoje uroki polegające na tym że pewne zapytania, składnie działają szybciej a inne wolniej - trzeba by było to też sprawdzić.
0

a ja tam dalej na query plan czekam...

0

pewnie brakuje Ci indeksów.
czytaj co ludzie do Ciebie piszą i pokaż plan zapytania.

0

pisałem już, że queryplan jest "remote" i nie wiem jak się do niego dostać.
s1 i s2 mają po 60 linii (~20 tabel) każda i explain nie mieści się na stronie. dałem spokój.
rozwiązałem sprawę dodając where rownum < maks. oczekiwana liczba rekordów w s2.
nie wiem dlaczego tak to działa ale działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1