Oracle中"TABLE ACCESS FULL"的”欺骗时刻“
Oracle中"TABLE ACCESS FULL"的”欺骗时刻“
基础表信息
缓存前提下,全表扫描表zkmbak需要1.69s,约229000个逻辑读。
14:53:18 ZKM@dev-app73/pdb(400)> select count(*) from zkmbak; COUNT(*) ---------- 150994944 Elapsed: 00:00:01.69 14:53:29 ZKM@dev-app73/pdb(400)> select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------------------------------------------------- SQL_ID f7mhuvxws84fv, child number 0 ------------------------------------- select count(*) from zkmbak Plan hash value: 2160384922 --------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | --------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:01.68 | 229K| | 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:01.68 | 229K| | 2 | TABLE ACCESS FULL| ZKMBAK | 1 | 150M| 150M|00:00:01.65 | 229K| --------------------------------------------------------------------------------------- 14 rows selected. Elapsed: 00:00:00.06
案例1
14:53:32 ZKM@dev-app73/pdb(400)> select count(*) from zkmbak where rownum<=10; COUNT(*) ---------- 10 Elapsed: 00:00:00.00 14:56:30 ZKM@dev-app73/pdb(400)> select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); PLAN_TABLE_OUTPUT --------------------------------------------------------------------------------------------------------------------- SQL_ID 22uwfszq8a9v7, child number 0 ------------------------------------- select count(*) from zkmbak where rownum<=10 Plan hash value: 3390400203 ---------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ---------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 3 | | 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 3 | |* 2 | COUNT STOPKEY | | 1 | | 10 |00:00:00.01 | 3 | | 3 | TABLE ACCESS FULL| ZKMBAK | 1 | 10 | 10 |00:00:00.01 | 3 | ---------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(ROWNUM<=10) 20 rows selected. Elapsed: 00:00:00.06
加了rownum<=10后,虽然有"TABLE ACCESS FULL"但是实际上扫描出符合条件的前10行数据后Oracle就停止扫描了。
因此并不会产生229000个逻辑读。
案例2
15:02:44 ZKM@dev-app73/pdb(400)> select count(*) from zkm where id in (select id from zkmbak); COUNT(*) ---------- 1000 Elapsed: 00:00:00.00 15:02:44 ZKM@dev-app73/pdb(400)> select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------------------------------------------------------- SQL_ID 7ypyj251q62s2, child number 0 ------------------------------------- select count(*) from zkm where id in (select id from zkmbak) Plan hash value: 783349724 ------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem | ------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 6 | | | | | 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 6 | | | | |* 2 | HASH JOIN SEMI | | 1 | 1000 | 1000 |00:00:00.01 | 6 | 2546K| 2546K| 1416K (0)| | 3 | TABLE ACCESS FULL| ZKM | 1 | 1000 | 1000 |00:00:00.01 | 3 | | | | | 4 | TABLE ACCESS FULL| ZKMBAK | 1 | 150M| 256 |00:00:00.01 | 3 | | | | ------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("ID"="ID") 21 rows selected. Elapsed: 00:00:00.06
其中,id=4这一步实际消耗逻辑读3个,实际取的行数为256(这个就不懂CBO是怎么判定的了)。
所以也没有进行实际上执行计划显示的全表扫描。
分类:
Oracle
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?