Table_a = 7022536行
Table_b(GTT)= 5601行
查询:
SELECT COUNT (a.ssn_head)
FROM table_a a, table_b b
WHERE b.hoh = a.head AND a.flag = 'Y';
需要20多秒才能带来17214条记录。
解释计划是:
Plan hash value: 1901401324
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | C
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 25 | 1
| 1 | SORT AGGREGATE | | 1 | 25 |
|* 2 | HASH JOIN | | 114K| 2801K| 1
| 3 | TABLE ACCESS FULL| table_b | 49188 | 528K|
| 4 | REMOTE | table_a | 7022K| 93M| 1
--------------------------------------------------------------------------------
table_b
(GTT)上没有索引...我认为既然查询遍历了table_b,那么它总会进行全表扫描。直接?
table_a
的索引位于head
还有什么方法可以让这个查询运行得更快?
答案 0 :(得分:5)
在table_b中是唯一的吗?如果是,那么
SELECT COUNT (a.ssn_head)
FROM table_a a, table_b b
WHERE b.hoh = a.head AND a.flag = 'Y';
在逻辑上等同于
SELECT COUNT (a.ssn_head)
FROM table_a a
WHERE a.flag = 'Y'
and a.head in (select hoh FROM table_b);
鉴于远程服务器上的数据量较大,我建议使用DRIVING_SITE提示在那里推送查询。
SELECT /*+DRIVING_SITE (r) */ COUNT (r.col_a)
FROM owner.table@other r
WHERE r.col_b in (select l.col_c FROM local l);
这应该使用同义词而不是table @ dblink。但它可能无法用于观点。
答案 1 :(得分:3)
在本地服务器上创建table_a的物化视图,并对其进行操作。
它可能也有助于(温和地)在a.flag上放置索引,但与本地操作相比,这将是微不足道的。