sql:
SELECT T.CODE
FROM T_DIM_OBJECT T
WHERE T.PATH LIKE (( SELECT A.PATH FROM T_DIM_OBJECT A WHERE A.OBJECT_ID=(‘11ec9ba9f514ebe6b4370b375bfd4359’) )||’%’)
AND T.STATUS = ‘ENABLE’
根据文档库中的信息,针对您提到的 LIKE 后跟 SELECT 表达式执行特别慢的问题,可以尝试以下几种方法来优化查询性能。您的问题合理,并且可以通过一些已知的技术手段进行解决。
1. 避免在 LIKE 中使用子查询
从您提供的 SQL 和执行计划来看,LIKE 操作符后面跟着一个子查询,这会导致 OceanBase 数据库无法有效地利用索引。通常情况下,数据库引擎对于 LIKE 后面带有复杂表达式的查询难以生成最优的执行计划。因此,建议将子查询的结果提前计算出来,再用于主查询中。正如您所提到的,当把 LIKE 后面的结果单独查出来替换 SELECT 表达式时速度会快很多,这是因为此时可以直接使用索引。
优化后的SQL:
-- 先获取子查询结果
SET @path = (SELECT A.PATH FROM T_DIM_OBJECT A WHERE A.OBJECT_ID = '11ec9ba9f514ebe6b4370b375bfd4359');
-- 使用变量代替子查询
SELECT T.CODE
FROM T_DIM_OBJECT T
WHERE T.PATH LIKE CONCAT(@path, '%')
AND T.STATUS = 'ENABLE';
SELECT /*+ INDEX(T idx_path) */ T.CODE
FROM T_DIM_OBJECT T
WHERE T.PATH LIKE (( SELECT A.PATH FROM T_DIM_OBJECT A WHERE A.OBJECT_ID='11ec9ba9f514ebe6b4370b375bfd4359' ) || '%')
AND T.STATUS = 'ENABLE';
EXPLAIN EXTENDED SELECT T.CODE
FROM T_DIM_OBJECT T
WHERE T.PATH LIKE (( SELECT A.PATH FROM T_DIM_OBJECT A WHERE A.OBJECT_ID='11ec9ba9f514ebe6b4370b375bfd4359' ) || '%')
AND T.STATUS = 'ENABLE';