oracle - Oracle 中第一次执行查询很慢
问题描述
Oracle 18c中数据仓库DB中查询的第一次执行时间为两分钟,但如果在第一次执行几秒后取消查询并重新运行查询,执行查询只需3秒,所以我想知道当我第一次取消查询导致第二次执行非常快时会发生什么。
查询的第一次和第二次执行的执行计划完全一样,所有的统计都是最新的,没有任何过时的统计,下面是执行计划。
以下是优化器参数
memoptimize_pool_size 0
inmemory_optimized_arithmetic DISABLE
plsql_optimize_level 2
optimizer_features_enable 12.1.0.2
optimizer_mode ALL_ROWS
optimizer_index_cost_adj 100
optimizer_index_caching 0
optimizer_dynamic_sampling 0
optimizer_ignore_hints FALSE
optimizer_secure_view_merging TRUE
optimizer_use_pending_statistics FALSE
optimizer_capture_sql_plan_baselines FALSE
optimizer_use_sql_plan_baselines TRUE
optimizer_use_invisible_indexes FALSE
optimizer_adaptive_reporting_only FALSE
optimizer_adaptive_plans TRUE
optimizer_inmemory_aware TRUE
optimizer_adaptive_statistics FALSE
我应该更改上面列表中任何参数的值来解决首次执行时间的性能问题吗?例如增加 optimizer_dynamic_sampling
解决方案
Oracle 数据库使用缓存内存来存储查询结果,取消查询执行与它无关。
Oracle 数据库使用缓冲区缓存来存储从磁盘读取的数据块。另一方面,结果缓存是 Oracle 11g 中的一个新特性,它正如其名称所暗示的那样,它缓存查询结果并将它们放入共享池的一个切片中。
第一次执行查询时,如果没有缓存数据,Oracle DB 会从磁盘中获取块,然后将它们缓存在缓冲池中,下次执行相同查询时,只需从缓冲池中获取块。
推荐阅读
- sql - 使用 Sql Server,如何查询 json 格式列中的元素?
- c++ - 不存在关于 clang 的预期歧义错误
- php - 如何使用 laravel 和 mysql 数据库获取数组中的数组?
- python - Scipy ttest_ind 置换测试由 equal_var 参数更改?
- three.js - Three.js r132 'getDirectionalDirectLightIrradiance' & 'getPointDirectLightIrradiance' 找不到匹配的重载函数错误
- powershell - Can I filter 2 different CommandType using Poweshell?
- python - os.listdir 也从文件夹中获取文件
- python - 如何使用 pixmap 和 Qlabel 使图像可选择?
- node.js - Is there any method to fetch the data from back-end MongoDB and show at front-end react JS?
- google-cloud-platform - 我无法创建网关 API Google 错误:“无法转换为服务配置。”位置:“未知位置”