| 6 |FILTER
|
| | | |
| 7 | SORT GROUP BY |
| 1 |20 |1277 |
| 8 |HASH JOIN
|
| 368K|7205K| 528 |
| 9 | INDEX FAST FULL SCAN| PK_PATIENT_PUBLIC_ID| 215K|3159K|33 |
|10 | INDEX FAST FULL SCAN| PK_PATIENT_PUBLIC_ID| 515K|2519K|33 |
-----------------------------------------------------------------------------------
这一步操作其实是nest loop, 用前面的查询中间结果做为驱动集, 执行n次
select a.patient_id
from (select patient_id, count(1) from patient_public_id group by patient_id having count(1)=1) a,
patient_public_id b
where a.patient_id=b.patient_id and b.context_id=1;
而每次执行该语句的逻辑读都很大,我为什么这么说呢, 因为
"2.其实,我把最后一个条件挑出来单独执行,也很快的.当我把最后的条件转换成表也就几十秒(不会多于2分钟)."
一条执行需要几十秒的SQL, 逻辑读应该在几百万左右.
所以整个SQL执行就非常慢.
而修改为临时表之后,
---------------------------------------------------------------------------
| Id| Operation
|Name
| Rows| Bytes | Cost|
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT |
| 1 |20 | 557 |
| 1 |SORT AGGREGATE|
| 1 |20 | |
| 2 | FILTER
|
| | | |
| 3 |TABLE ACCESS FULL | STUDY
| 323K|6317K| 557 |
| 4 |INDEX RANGE SCAN| TEMP_DEL_FACILITY| 1 |13 | 1 |
| 5 |INDEX RANGE SCAN| TEMP_DEL_SOURCE| 1 |13 | 1 |
| 6 |TABLE ACCESS FULL | TMP_PATIENT_ID | 5 |65 | 2 |
---------------------------------------------------------------------------
虽然还是执行nest loop, 但是每次对临时表TMP_PATIENT_ID访问的逻辑读很小(因为只有几千笔记录, 估计单次访问的逻辑读就几十),所以速度提高很快.
我想, 如果能将原来的执行计划中的filter都改为hash, 应该更快, 不过由于你的各个谓词条件都是or连接的, 我也拿不准能不能改成hash.
[ 本帖最后由 mihawk 于 2008-4-10 14:00 编辑 ] |