为什么 SQL 语句在使用变量时执行 PL/SQL 需要这么长时间?

Why SQL statement is taking so long to execute PL/SQL when using variables?

我有一个 table 有 10 000 000 个随机 numbers.This 语句在大约 2 秒内执行(没有创建索引)'select count(1) from myTableName where x + 200 < 500',但是如果我在 (x + 200) 我在不到 0.1 秒的时间内得到了这个查询的结果。 所以,如果我做这样的事情:

declare
    cursor example is
        select count(1) countOf from padure where x + 200 < 500;
begin
    for i in example loop
        dbms_output.put_line(i.countOf);
    end loop;
end;

我在 0.2 秒内执行了所有块,但是,如果我这样做:

declare
    nbr constant integer := 200;
    cursor example is
        select count(1) countOf from padure where x + nbr < 500;
begin
    for i in example loop
        dbms_output.put_line(i.countOf);
    end loop;
end;

我在大约 2 秒内得到结果。 为什么当我使用变量时需要这么多时间来执行这个查询? 我怎样才能避免这种情况?或者如何实现与第一个示例相同的时间执行?

尝试:

nbr constant integer := 200;
other_nbr constant integer := 500 - nbr;

然后

select count(1) countOf 
from padure 
where x < other_nbr;

只为 x 创建一个索引,应该可以正常工作。

问题是当您使用变量索引时不知道值是 200 并且必须评估每一行

这样你只有一个常数,索引就可以正常工作。

一般规则,字段上的任何函数都会使索引不可用。