使用游标参数会导致不同的执行计划?
Using cursor parameter results in a different execution plan?
出于某种原因,我试图弄清楚为什么以下查询通过完整 table 扫描执行,这需要很长时间,因为 table 有 ~31M 行
PROCEDURE d1(k_uni_in IN data_par.k_uni%TYPE) AS
CURSOR d1_cur IS
SELECT d.*
FROM data_par d
WHERE d.k_uni = k_uni_in
ORDER BY d.k_date;
BEGIN
FOR i IN d1_cur LOOP
...
END LOOP;
END;
然而看似相似的查询运行索引范围扫描并且几乎是即时的
PROCEDURE d1(k_uni_in IN data_par.k_uni%TYPE) AS
CURSOR d1_cur(k_cv IN data_par.k_uni%TYPE) IS
SELECT d.*
FROM data_par d
WHERE d.k_uni = k_cv
ORDER BY d.k_date;
BEGIN
FOR i IN d1_cur(k_uni_in) LOOP
...
END LOOP;
END;
为什么会这样?我应该始终使用游标参数而不是在游标中使用 suprogram 参数吗?
如果您的 table DATA_PAR 有一个名为 K_UNI_IN 的列,那么 Oracle 正在解释这一行:
WHERE d.k_uni = k_uni_in
意思是
WHERE d.k_uni = d.k_uni_in
而且,由于这显然不是索引可以帮助解决的情况,您将获得完整的 table 扫描。
另请参阅:http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/nameresolution.htm#LNPLS2038
出于某种原因,我试图弄清楚为什么以下查询通过完整 table 扫描执行,这需要很长时间,因为 table 有 ~31M 行
PROCEDURE d1(k_uni_in IN data_par.k_uni%TYPE) AS
CURSOR d1_cur IS
SELECT d.*
FROM data_par d
WHERE d.k_uni = k_uni_in
ORDER BY d.k_date;
BEGIN
FOR i IN d1_cur LOOP
...
END LOOP;
END;
然而看似相似的查询运行索引范围扫描并且几乎是即时的
PROCEDURE d1(k_uni_in IN data_par.k_uni%TYPE) AS
CURSOR d1_cur(k_cv IN data_par.k_uni%TYPE) IS
SELECT d.*
FROM data_par d
WHERE d.k_uni = k_cv
ORDER BY d.k_date;
BEGIN
FOR i IN d1_cur(k_uni_in) LOOP
...
END LOOP;
END;
为什么会这样?我应该始终使用游标参数而不是在游标中使用 suprogram 参数吗?
如果您的 table DATA_PAR 有一个名为 K_UNI_IN 的列,那么 Oracle 正在解释这一行:
WHERE d.k_uni = k_uni_in
意思是
WHERE d.k_uni = d.k_uni_in
而且,由于这显然不是索引可以帮助解决的情况,您将获得完整的 table 扫描。
另请参阅:http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/nameresolution.htm#LNPLS2038