count()查询耗时超过20秒

lea*_*sql 1 sql oracle indexing optimization

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';
Run Code Online (Sandbox Code Playgroud)

需要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
--------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

table_b (GTT)上没有索引......我认为既然查询遍历了table_b,那么它总会进行全表扫描.

table_a 有索引 head

还有什么方法可以让这个查询运行得更快?

Gar*_*ers 5

table_b中的唯一吗?如果是的话,那么

SELECT COUNT (a.ssn_head)
FROM table_a a, table_b b
WHERE b.hoh = a.head AND a.flag = 'Y';
Run Code Online (Sandbox Code Playgroud)

在逻辑上等同于

SELECT COUNT (a.ssn_head)
FROM table_a a
WHERE a.flag = 'Y'
and a.head in (select hoh FROM table_b);
Run Code Online (Sandbox Code Playgroud)

鉴于远程服务器上的数据量较大,我建议使用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);
Run Code Online (Sandbox Code Playgroud)

这应该使用同义词而不是table @ dblink.但它可能无法用于视图.