【发布时间】:2018-08-27 03:58:58
【问题描述】:
我有两条 SQL 语句,我希望它们的性能相似,但实际上 SQL1 使用了 0.065 秒,而 SQL2 使用了超过 10 秒,总共只有 8000 条记录。谁能帮忙解释一下?如何优化 SQL2?
SQL 1:
select
job_id,
JOB_DESCRIPTION,
REGEXP_COUNT(JOB_Description, '(ABC|DEF)([[:digit:]]){5}') as occurrences
from smms.job
where TO_NUMBER(to_char(CREATE_DATE,'YYYY')) = 2017;
SQL 2:
select job_id, JOB_Description
from (
select
job_id,
JOB_DESCRIPTION,
REGEXP_COUNT(JOB_Description, '(ABC|DEF)([[:digit:]]){5}') as occurrences
from smms.job
where TO_NUMBER(to_char(CREATE_DATE,'YYYY')) = 2017
)
where occurrences > 0;
【问题讨论】:
-
虽然这与您的问题有些不同,但为什么“SQL 2”使用子查询?
occurrences没有在最终的选择列表中使用,所以我不明白你为什么不在WHERE子句中直接使用REGEXP_COUNT。即SELECT job_id, job_description FROM sims.job WHERE TO_NUMBER... =2017 AND REGEXP_COUNT... > 0 -
查询的执行计划是什么?如果将
TO_NUMBER(to_char(CREATE_DATE,'YYYY'))=2017更改为CREATE_DATE >= DATE'2017-01-01' AND CREATE_DATE < DATE'2018-01-01'会发生什么? -
你说的这个子句是我的第一个版本,但是也需要10多秒,所以我尝试了差异子句来优化它。
-
我猜想版本 1 能够将相当昂贵的正则表达式操作限制为较小的结果集 - 两个版本的执行计划应该显示差异(或者可能是带有事件 10046 的 sql 跟踪)。 create_date 有索引吗?
-
SQL3: select count(*) from smms.job where REGEXP_COUNT(JOB_Description, '(ABC|DEF)([[:digit:]]){5}')>0, 需要 10秒,这意味着性能与 CREATE_DATE 过滤器无关,它完全取决于 REGEXP_COUNT 子句。
标签: sql oracle query-performance