Query plan remoto postgresql-oracle

From: jaime soler <jaime(dot)soler(at)gmail(dot)com>
To: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Query plan remoto postgresql-oracle
Date: 2015-06-17 11:57:31
Message-ID: 1434542251.3638.59.camel@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Buenas días lista,

Tengo estas tablas de ejemplo

create table TR
(
cod NUMBER(8) not null,
dat DATE not null
)
;

create table TL
(
cod NUMBER(8) not null,
des VARCHAR2(1000)
)
;

y ejecutando queries del estilo:

select * from TL L
WHERE EXISTS
(
SELECT 'x'
FROM TR R
WHERE l.cod = r.cod
and dat >= trunc(now() - 110)
and dat <= trunc(now() - 10)
);

consigo planes de ejecución usando semi join ( hash semi join ), que
según entiendo va a ser el plan de ejecución óptimo en consultas usando
exists cuando ambas tablas están en postgresql.
El problema aparece cuando tengo la tabla TR en oracle y TL en
postgresql, que tanto si uso dblink, dblink_ora o fdw no consigo el uso
de semi join, sino Foreign Scan que entiendo que son equivalentes a seq
scans.
Las estadísticas entre oracle y postgresql, entiendo que no se están
intercambiando, ¿ no?, cuando uso dblink y dblink_ora.
También he intentado usar la opción, plan_costs, del fdw de oracle
(https://github.com/laurenz/oracle_fdw) pero el plan de ejecución
tampoco mejora.

¿ pensáis que puede mejorarse el plan de ejecución de está query ?

explain ( analyze true, verbose true, costs true, buffers true, timing
true )
select * from TL L
WHERE EXISTS
(
SELECT cod
FROM TR(at)dblink R
WHERE l.cod = r.cod
and dat >= trunc(sysdate - 10)
and dat <= trunc(sysdate - 5)
)

"Seq Scan on tl l (cost=0.00..161529.00 rows=5000 width=1009) (actual
time=65.570..111324.374 rows=50 loops=1)"
" Output: l.cod, l.des"
" Filter: (SubPlan 1)"
" Rows Removed by Filter: 9950"
" Buffers: shared hit=1429"
" SubPlan 1"
" -> Foreign Scan on pg_temp_6._dblink_tr_1 r (cost=15.00..25.00 rows=10
width=0) (actual time=11.125..11.125 rows=0 loops=10000)"
" Filter: (l.cod = r.cod)"
" Rows Removed by Filter: 50"
" Remote Query: SELECT cod, NULL FROM tr WHERE (dat >= trunc((sysdate -
10))) AND (dat <= trunc((sysdate - 5)))"
"Planning time: 0.714 ms"
"Execution time: 111326.661 ms"

usando dblink_ora_record:

explain ( analyze true, verbose true, costs true, buffers true, timing
true )
select * from TL L
WHERE EXISTS
(
SELECT cod
FROM (select cod, dat from
(
select * FROM dblink_ora_record('TEST',
'select cod, dat
from TR') AS
TR_LOCAL(cod number, dat timestamp)
)) R
WHERE l.cod = r.cod
and dat >= trunc(sysdate - 10)
and dat <= trunc(sysdate - 5)
);

"Seq Scan on tl l (cost=0.00..326554.00 rows=5000 width=1009) (actual
time=214.223..16124.594 rows=50 loops=1)"
" Output: l.cod, l.des"
" Filter: (SubPlan 1)"
" Rows Removed by Filter: 9950"
" Buffers: shared hit=1429"
" SubPlan 1"
" -> Function Scan on pg_catalog.dblink_ora_record tr_local
(cost=0.00..32.50 rows=1 width=0) (actual time=1.611..1.611 rows=0
loops=10000)"
" Function Call: dblink_ora_record('TEST'::text, 'select cod, dat"
"from TR'::text)"
" Filter: ((l.cod = tr_local.cod) AND (tr_local.dat >= trunc((sysdate -
10))) AND (tr_local.dat <= trunc((sysdate - 5))))"
" Rows Removed by Filter: 9972"
"Planning time: 0.413 ms"
"Execution time: 16124.760 ms"

Un saludo

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripcin:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message jaime soler 2015-06-17 11:59:13 Re: Query plan remoto postgresql-oracle
Previous Message jaime soler 2015-06-17 11:40:38 Query plan remoto postgresql-oracle