为什么 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 并且必须评估每一行
这样你只有一个常数,索引就可以正常工作。
一般规则,字段上的任何函数都会使索引不可用。
我有一个 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 并且必须评估每一行
这样你只有一个常数,索引就可以正常工作。
一般规则,字段上的任何函数都会使索引不可用。