SQL 共享之 ROLL_INVALID_MISMATCH 含义
这篇讲的是一个朋友遇到的SQL共享难题。一条SQL莫名选择了低效的MERGE JOIN CARTESIAN执行计划,检查发现是游标无法共享导致的。问题定位到V$SQL_SHARED_CURSOR视图中一个名为ROLL_INVALID_MISMATCH的标志位。 这个标志字面意思是“滚动失效不匹配”,Oracle官方文档解释为“已标记进行滚动失效且超出了失效窗口”。它其实指向了一个特定的Oracle优化机制:在DBMS_STATS收集对象统计信息时,Oracle可以选择不立即让依赖的游标失效,而是给一个宽限期(窗口)。一旦宽限期结束,这些游标就会被批量标记为失效,下次执行时需要重新解析和生成计划。 所以,ROLL_INVALID_MISMATCH的出现,通常意味着这次统计信息收集后,该SQL相关的游标正处于这个“等待批量失效”的状态。这本质上是Oracle为平衡性能与计划新鲜度而设计的一种滚动失效策略。理解这一点,是解决这类“SQL突然变慢”问题的关键线索之一。