observe查询缓存

1、最近在生产环境遇到查询性能慢的问题
ob数据库第一次查询是1分钟左右,然后第二次查询是10秒左右,后面第三第四次也是一样的,但是问题来了,第二天在跑同样的SQL查询又到了一分钟左右,第二次是10秒左右;
2、我理解第一次查询慢是从磁盘读取数据,然后第二次是在内存中去读,为啥第二天还是去磁盘中读取,难道缓存没了,缓存这边也没有清除,还是缓存有时间限制吗?还是说有别的原因,烦请各位大佬解答一下,谢谢!

可以具体看看语句的执行计划和gv$ob_sql_audit信息
可以先用obdiag收集一下plan_monitor信息
obdiag gather plan_monitor --trace_id YB420BA2D99B-0005EBBFC45D5A00-0-0 --env “{db_connect=’-hxx -Pxx -uxx -pxx -Dxx’}”
https://www.oceanbase.com/docs/common-obdiag-cn-1000000004494424

如果故障可以重现,就进行如下操作;
1.每次执行后,查看真实的执行计划,看每次的执行计划是否相同。
2.从GV$OB_SQL_AUDIT中查看每次执行后的相关信息,看需要访问的数据是否命中缓存,例如如下指标。
 ROW_CACHE_HIT:行缓存命中次数。
 BLOOM_FILTER_CACHE_HIT:bloom filter缓存命中次数。
 BLOCK_CACHE_HIT:块缓存命中次数。
 BLOCK_INDEX_CACHE_HIT:块索引缓存命中次数。
 DISK_READS:物理读次数。
如果每次执行时的执行计划完全相同,而只有第一次慢,后面几个都很快,并且花费时间相同,看就是不是因为没有缓存命中。

看描述像是因为计划缓存淘汰导致,sql走了硬解析。
可以看下gv$ob_sql_audit视图根据sql_id或者trace_id捞出sql,看下执行很慢的那次IS_HIT_PLAN字段是否为1,1则代表走了硬解,硬解是因为计划缓存被淘汰,符合预期。