sql – 我的查询运行速度更快,第二次,我该如何阻止?

前端之家收集整理的这篇文章主要介绍了sql – 我的查询运行速度更快,第二次,我该如何阻止?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在oracle中运行查询10从B中选择A,其中C = D
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 |
---------------------------------------------------------------------------------------------------------------------

猜你在找的MsSQL相关文章