【 使用环境 】测试环境
【 OB or 其他组件 】observer
【 使用版本 】企业版3.2.3/社区版3.1.3
创建outline一直不生效
有张表大概20000条数据,table 名test_otl, 字段(id int,name varchar(20))
创建了索引 idx_id(id)
select id from test_otl where id =1 这样现在是会走索引的,
我想测试让它走全表扫描,
select/*+FULL(test_otl)*/ id from test_otl where id =1;
使用explain select/*+FULL(test_otl)*/ id from test_otl where id =1; #查看确实走了全表扫描
创建outline
create outline otl_test on select/*+FULL(test_otl)*/ id from test_otl where id =1;
这样创建完成以后,按理说每次查询我都直接走全表扫描了,可是为啥还是走索引呢??? 命名空格啥的我都注意了啊
2 个赞
坤易
2023 年10 月 22 日 11:11
#3
要用explain 看下是否使用outline,还有就是空格、大小写都要检查下。
3 个赞
没有使用,我执行explain,里面还是显示走索引,难不成是需要参数或者变量啥的设置吗?? 我查了也没有啊,很奇怪,企业版和社区版都试了不行,,现在看来大概率是我使用的问题,,
2 个赞
outline 建好后,实际sql 要跑一次。然后去查看 实际执行计划。不是看 EXPLAIN 结果。
类似下面,查看这个视图。
mysql> SELECT plan_depth, plan_line_id, operator,name,ROWS,cost
-> FROM oceanbase.GV$OB_PLAN_CACHE_PLAN_EXPLAIN
-> WHERE tenant_id=effective_tenant_id() AND svr_ip = '10.0.0.66' AND svr_port=2882 AND plan_id=190;
+------------+--------------+------------------------+--------------+------+------+
| plan_depth | plan_line_id | operator | name | ROWS | cost |
+------------+--------------+------------------------+--------------+------+------+
| 0 | 0 | PHY_NESTED_LOOP_JOIN | NULL | 2 | 172 |
| 1 | 1 | PHY_SUBPLAN_SCAN | NULL | 1 | 154 |
| 2 | 2 | PHY_SCALAR_AGGREGATE | NULL | 1 | 154 |
| 3 | 3 | PHY_SUBPLAN_SCAN | NULL | 1 | 154 |
| 4 | 4 | PHY_TABLE_SCAN | bmsql_oorder | 1 | 154 |
| 1 | 5 | PHY_TABLE_SCAN | bmsql_oorder | 1 | 17 |
+------------+--------------+------------------------+--------------+------+------+
6 rows in set (0.05 sec)
1 个赞
我刚刚又逛了下关于绑定的,确实是我自己理解的问题,认知不对, 现在搞清楚了,其实是生效的,是自己查询的东西不对,,感谢大佬周末热心帮助!!!
1 个赞
如何有效使用 outline 功能?
阅读本文你将了解:
如何获取 SQL ID
如何创建 outline
如何正确验证 outline 效果
为了防止某些 SQL 的执行计划发生变化,我们通常会创建 outline 来绑定执行计划。但是为什么实际过程中,我们创建 outline 并验证时总会遇到不生效的情况?