count()查询耗时超过20秒

时间:2010-07-14 22:48:27

标签: 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';

需要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

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

2 个答案:

答案 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上放置索引,但与本地操作相比,这将是微不足道的。