我在oracle中运行查询10从B中选择A,其中C = D
B有数百万条记录,C上没有索引
B有数百万条记录,C上没有索引
我第一次运行它需要大约30秒,第二次运行查询大约需要1秒钟.
显然,它是缓存的东西,我希望它停止,每次我运行的查询,我想要30年 – 就像它是第一次运行.
>我过度简化了我为了使问题可读而产生的问题.
谢谢
解决方法
清除缓存以测量性能是可能的,但是非常难以实现.
跟踪调查工作性能的一个很好的措施是在查询执行期间计数读取块的数量.最简单的方法之一是使用sqlplus与autotrace,像这样:
set autotrace traceonly <your query>
... Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 1 consistent gets 0 physical reads 0 redo size 363 bytes sent via sql*Net to client 364 bytes received via sql*Net from client 4 sql*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
从缓存或从磁盘读取的块数量是一致的.
另一种方式是使用增加的统计信息运行查询,即使用提示collect_plan_statistics,然后从光标缓存查看查询计划:
auto autotrace off set serveroutput off <your query with hint gather_plan_statistics> select * from table(dbms_xplan.display_cursor(null,null,'typical allstats'));
读取的块数在列缓冲区中输出.
--------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | Cost (%cpu)| E-Time | A-Rows | A-Time | Buffers | --------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 3 | | 1 (100)| | 3 |00:00:00.01 | 3 | | 1 | SORT AGGREGATE | | 3 | 1 | | | 3 |00:00:00.01 | 3 | | 2 | INDEX FULL SCAN| ABCDEF | 3 | 176 | 1 (0)| 00:00:01 | 528 |00:00:00.01 | 3 | ---------------------------------------------------------------------------------------------------------------------