Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: ORACLE 10g - DB link, inserty i wyimaginowane CLOB-y

Mam kłopot i sądzę, że jest to problem z optymalizatorem, który po swojemu realizuje operację MINUS. Uruchomienie poniższego kodu powoduje błąd: "ORA-22992: cannot use LOB locators selected from remote tables".

1. Tabela brel.kth_adresy@abc zawiera 2 pola typu CLOB, ale one tutaj nie są selectowane.
Tabela uat_dls.tmp_dls_tabele_probka_tst nie zawiera w ogóle lobów.
2. ID jest typu Number(10).
 INSERT INTO uat_dls.dls_rekordy_bledne (
dls_tabela_id
,pk_biznesowy_wartosc
,inf_przetwarzanie_id
,czy_nadmiarowy_w_dls
,inf_proces_weryfikacji_id
)
SELECT 66
,id
,52
,1
,224
FROM (SELECT id
FROM (SELECT tab.*
,row_number ( ) OVER (PARTITION BY id ORDER BY tab.inf_date DESC)
rn
FROM dwh_load_stage.kth_adresy tab
JOIN
uat_dls.tmp_dls_tabele_probka_tst tst
ON tst.pk_biznesowy_wartosc = to_char ( id ))
WHERE rn = 1
MINUS
SELECT id
FROM brel.kth_adresy@abc tab
JOIN
uat_dls.tmp_dls_tabele_probka_tst tst
ON tst.pk_biznesowy_wartosc = to_char ( id ));


3. Zaden z poniższych kodów się nie wywala, więc zakładam, że problemem jest operacja optymalizacji odejmowania.
 INSERT INTO uat_dls.dls_rekordy_bledne (
dls_tabela_id
,pk_biznesowy_wartosc
,inf_przetwarzanie_id
,czy_nadmiarowy_w_dls
,inf_proces_weryfikacji_id
)
SELECT 66
,id
,52
,1
,224
FROM (SELECT id
FROM brel.kth_adresy@abc tab
JOIN
uat_dls.tmp_dls_tabele_probka_tst tst
ON tst.pk_biznesowy_wartosc = to_char ( id ));

 INSERT INTO uat_dls.dls_rekordy_bledne (
dls_tabela_id
,pk_biznesowy_wartosc
,inf_przetwarzanie_id
,czy_nadmiarowy_w_dls
,inf_proces_weryfikacji_id
)
SELECT 66
,id
,52
,1
,224
FROM (SELECT id
FROM (SELECT tab.*
,row_number ( ) OVER (PARTITION BY id ORDER BY tab.inf_date DESC)
rn
FROM dwh_load_stage.kth_adresy tab
JOIN
uat_dls.tmp_dls_tabele_probka_tst tst
ON tst.pk_biznesowy_wartosc = to_char ( id ))
WHERE rn = 1);


Czy jest jakiś HINT, który powie oracle'owi: "weź tylko to pole, które user napisał, że chce wziąć", bo mam wrażenie, że on z jakiegoś powodu próbuje odejmować całe wiersze(?)?
A może czegoś nie zauważyłam?Izabela Korzińska edytował(a) ten post dnia 06.04.11 o godzinie 17:32Izabela Korzińska edytował(a) ten post dnia 06.04.11 o godzinie 17:34
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: ORACLE 10g - DB link, inserty i wyimaginowane CLOB-y

Dziwne, że Oracle przy tym głupieje...

Spróbuj może z hintem DRIVING_SITE. Zapewne próbuje wykonać join na lokalnej bazie i z tego powodu próbuje namierzyć również LOB-y. Jakby go zmusić do wykonania po drugiej stronie, wtedy nie będzie musiał tego robić.

http://www.dba-oracle.com/t_driving_site_hint.htm
Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: ORACLE 10g - DB link, inserty i wyimaginowane CLOB-y

Łukasz Kurowski:
Dziwne, że Oracle przy tym głupieje...

Spróbuj może z hintem DRIVING_SITE. Zapewne próbuje wykonać join na lokalnej bazie i z tego powodu próbuje namierzyć również LOB-y. Jakby go zmusić do wykonania po drugiej stronie, wtedy nie będzie musiał tego robić.

http://www.dba-oracle.com/t_driving_site_hint.htm
Dzięki :)
Fajne, ale nie pomogło. Dodam, że tylko przy insercie się pluje. Jeśli zostawić tylko 2 selecty z minusem, będzie ok.
Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: ORACLE 10g - DB link, inserty i wyimaginowane CLOB-y

Zadziałało również wyrzucenie tabelki tymczasowej (on commit preserve rows). Ta tabelka zawiera tylko 1 pole typu varchar2(300 byte) i służy do zawężania danych. Wniosek z tego taki, że wystarczy zjoinować tabelę zawierającą cloby z dowolnąinną tabelą i już jest problem.

Nie wywala błędu:
INSERT INTO uat_dls.dls_rekordy_bledne (
dls_tabela_id
,pk_biznesowy_wartosc
,inf_przetwarzanie_id
,czy_nadmiarowy_w_dls
,inf_proces_weryfikacji_id
)
SELECT 66
,id
,52
,1
,224
FROM (SELECT id
FROM (SELECT tab.*
,row_number ( ) OVER (PARTITION BY id ORDER BY tab.inf_date DESC)
rn
FROM dwh_load_stage.kth_adresy tab)
WHERE rn = 1
MINUS
SELECT id
FROM brel.kth_adresy@abc tab);
Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: ORACLE 10g - DB link, inserty i wyimaginowane CLOB-y

I to działa:
INSERT INTO uat_dls.dls_rekordy_bledne (
dls_tabela_id
,pk_biznesowy_wartosc
,inf_przetwarzanie_id
,czy_nadmiarowy_w_dls
,inf_proces_weryfikacji_id
)
SELECT 66
,id
,52
,1
,224
FROM (SELECT id
FROM (SELECT tab.*
,row_number ( ) OVER (PARTITION BY id ORDER BY tab.inf_date DESC)
rn
FROM dwh_load_stage.kth_adresy tab
JOIN
uat_dls.tmp_dls_tabele_probka_tst tst
ON tst.pk_biznesowy_wartosc = to_char ( id ))
WHERE rn = 1
MINUS
SELECT id
FROM (SELECT id FROM brel.kth_adresy@abc) tab
JOIN
uat_dls.tmp_dls_tabele_probka_tst tst
ON tst.pk_biznesowy_wartosc = to_char ( id ));


Babska intuicja się przydaje... czasem :)Izabela Korzińska edytował(a) ten post dnia 06.04.11 o godzinie 18:53
Andrzej P.

Andrzej P. Oracle Database
Consultant

Temat: ORACLE 10g - DB link, inserty i wyimaginowane CLOB-y

Czyli baza najpierw pobiera loba do wykonania złączenia tabel, potem zgłasza błąd.

Prawdopodobnie zastąpienie JOIN-a warunkiem EXISTS też dałoby pożądany efekt.
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: ORACLE 10g - DB link, inserty i wyimaginowane CLOB-y

Izabela Korzińska:
Dzięki :)
Fajne, ale nie pomogło. Dodam, że tylko przy insercie się pluje. Jeśli zostawić tylko 2 selecty z minusem, będzie ok.

Niezły ficzers Ci się trafił :). To chyba popularny problem i różne magiczne sposoby ludzie stosują na jego obejście. Tutaj jest kilka:
http://forums.oracle.com/forums/thread.jspa?threadID=3...

Ten jest szczególnie ciekawy:
But, look at this curious thing: I re-write the query as follows:

SELECT A.ID, A.ID_REF, A.EVENDATE, B.DESCRIPTION
FROM A@ORCL A, B@ORCL B
WHERE A.ID_REF = B.ID_REF;

and it works fine... It seems like Oracle don't like the ANSI SQL92...
Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: ORACLE 10g - DB link, inserty i wyimaginowane CLOB-y

Łukasz Kurowski:
[...]
Ten jest szczególnie ciekawy:
But, look at this curious thing: I re-write the query as follows:

SELECT A.ID, A.ID_REF, A.EVENDATE, B.DESCRIPTION
FROM A@ORCL A, B@ORCL B
WHERE A.ID_REF = B.ID_REF;

and it works fine... It seems like Oracle don't like the ANSI SQL92...
Faktycznie :)
To też działa:
INSERT INTO uat_dls.dls_rekordy_bledne (
dls_tabela_id
,pk_biznesowy_wartosc
,inf_przetwarzanie_id
,czy_nadmiarowy_w_dls
,inf_proces_weryfikacji_id
)
SELECT 66
,id
,52
,1
,224
FROM (SELECT id
FROM (SELECT tab.*
,row_number ( ) OVER (PARTITION BY id ORDER BY tab.inf_date DESC)
rn
FROM dwh_load_stage.kth_adresy tab
JOIN
uat_dls.tmp_dls_tabele_probka_tst tst
ON tst.pk_biznesowy_wartosc = to_char ( id ))
WHERE rn = 1
MINUS
SELECT id
FROM brel.kth_adresy@abc tab
,uat_dls.tmp_dls_tabele_probka_tst tst
WHERE tst.pk_biznesowy_wartosc = to_char ( id ));


:))))



Wyślij zaproszenie do