SQL 优化的 分类早就有了, 就是碰不到 优化的典型例子, 今天遇到一个.......
页面上面的SQL :
select count(*)
from taba.npai, dm_area dawhere npai.local_area_id = 3
and npai.area_id = da.area_id
第一次跑 65s 让人忍受不了
简单看下执行计划, 忘记搞出来了, 大致知道内容。 taba 的local_area_id 表作为 list 分区, 分区中大概有 2千万数据, 看了一个 segements 大概 2.5G好像。
谓词过滤条件为 da.area_id , 大概91 条数据, 主要 dm_area 的影响, dm_area 表正好为 参数表, area_id 对应一条数据,
于是优化SQL 思路有了,考察了 area_id 列, 发现最适合建的索引 create bitmap index idx_area_id on tab (area_id,0) local;
select /*+ index(npai, idx_area_id) */ count(1) from taba npai, dm_area da
where npai.local_area_id = 3 and npai.area_id = da.area_id ---- 结果好像是 5秒
一看还有地方 可以改进
select /*+ index(npai, idx_area_id) */ count(1) from taba npai where npai.local_area_id = 3
and exists ( select 1 from dm_area da where npai.area_id = da.area_id); --- 0.017s
最终定型