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
还有什么方法可以让这个查询运行得更快?
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.但它可能无法用于视图.