本文介绍执行计划绑定后通过 EXPLAIN 语句发现执行计划没有按期望执行时应该如何进行问题排查和解决问题。
适用版本
OceanBase 数据库所有版本
问题现象
通过 OUTLINE 为 SQL 语句绑定执行计划,预期查询是通过索引执行的,但通过 EXPLAIN 语句发现执行该语句并没有通过索引,而是使用的表扫描(TABLE SCAN)。
obclient> CREATE OUTLINE ON SELECT /*+ index($ind)*/ * FROM $table;
obclient> EXPLAIN SELECT * FROM $table;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Query Plan
|
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ============================-=========
|ID|OPERATOR |NAME |EST. ROWS|COST |
--------------------------------------
|0 |TABLE SCAN|$table|100000 |38681|
===========================-==========
Outputs & filters:
-------------------------------------
0 - output([$table.id]), filter(nil),
access([$table.id]), partitions(p0)
|
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.28 sec)
可能原因
这其实并不是一个问题,出现这种情况的原因是由于绑定的执行计划并不会在 EXPLAIN 中展示。
解决方式
查询 V$PLAN_CACHE_PLAN_STAT 视图的 outline_id 列,发现该列的值不为 -1,说明执行计划已绑定。
obclient> select outline_id from oceanbase.GV$PLAN_CACHE_PLAN_STAT LIMIT 1;
+------------+
| outline_id |
+------------+
| xxxxxxxxx |
+------------+
1 row in set (0.02 sec)