今天抓到一条SQL语句执行了近6个小时。
分析了下执行计划,问题出在远程调用主数据上,由于执行计划是在本地生成,无法获取远程表的统计信息,所以无法生成准确的执行计划,执行计划中用的是nested loops相当于是两个for循环,在这么大的数据量的情况下很不适用(见附录)。还有一个原因是数据库把远程表的数据取过来也很耗时。
数据规模:
select count(1) from GG_INSTALL_TRANSFORMER;--106462
select count(1) from GG_INSTALL_POINT;--4300278
select count(1) from GG_CONTRACT;--3349652
select count(1) from GG_USER;--3360398
select count(1) from GG_INSTALL_POINT;--4300278
select count(1) from GG_CONTRACT;--3349652
select count(1) from GG_USER;--3360398
执行计划:
解决方案:1. 把主数据的几张表同步到本地数据库中。
2. 分成多个SQL,把调用远程数据库的功能剥离出来,把取数据的功能建立在远程数据库中供本地数据库调用。