环境: CentOS 5.7 64bit, Oracle 11gR2, Greenplum Database 4.2.1.0, Oracle gateway 11g
场景:greenplum内有个表大概50多万条数据,通过dblink汇总此表需要1分钟的时候(语句:select count(*) from tab1 where “date_id” = 20130108),其中过程推测是—-解析sql成gp可以执行的语句,将50万数据传输到Oracle database服务器(通过sar -n dev 1 100可知),再到oracle database汇总数据。这也是造成查询奇慢的原因。
解决方法:Oracle gateway有个包dbms_hs_passthrough,它将语句直接推送到异构数据库内执行,然后把执行的结果通过gateway传输到oracle database展现。
例:
declare
c int;
nr int;
res int;
begin
c := dbms_hs_passthrough.open_cursor@gp3;
dbms_hs_passthrough.parse@gp(c, ‘select count(*) from tab1 where date_id = 20130108’);
nr := dbms_hs_passthrough.fetch_row@gp(c);
dbms_hs_passthrough.get_value@gp(c, 1, res);
dbms_hs_passthrough.close_cursor@gp(c);
dbms_output.put_line(res);
end;
c int;
nr int;
res int;
begin
c := dbms_hs_passthrough.open_cursor@gp3;
dbms_hs_passthrough.parse@gp(c, ‘select count(*) from tab1 where date_id = 20130108’);
nr := dbms_hs_passthrough.fetch_row@gp(c);
dbms_hs_passthrough.get_value@gp(c, 1, res);
dbms_hs_passthrough.close_cursor@gp(c);
dbms_output.put_line(res);
end;
执行只需要2秒而已