Oracle 过程参数中的数据类型差异及其内部的sql查询

Oracle 过程参数中的数据类型差异及其内部的sql查询,oracle,plsql,query-optimization,data-conversion,Oracle,Plsql,Query Optimization,Data Conversion,在我的后端过程中,我有一个varchar2参数,我在SQL查询中使用它来搜索数字列。这会导致性能问题吗 例如: Proc (a varchar) is select * from table where deptno = a; end 这里deptno是表中的数字列,a是varchar。可能会这样。数据库将通过将DEPTNO强制转换为VARCHAR2来解决数据类型的差异。这将阻止优化器使用该列上的任何(正常)索引。根据数据量和分布情况,索引读取可能并不总是最有效的访问路径,在这种情况下,数据

在我的后端过程中,我有一个varchar2参数,我在SQL查询中使用它来搜索数字列。这会导致性能问题吗

例如:

Proc (a varchar)
is 
select * from table where deptno = a;
end

这里deptno是表中的数字列,a是varchar。

可能会这样。数据库将通过将DEPTNO强制转换为VARCHAR2来解决数据类型的差异。这将阻止优化器使用该列上的任何(正常)索引。根据数据量和分布情况,索引读取可能并不总是最有效的访问路径,在这种情况下,数据转换并不重要

所以这要看情况而定。但是,如果这很重要,您有什么选择(您在该列上有一个高度选择性的索引)

一种解决方案是在查询中应用显式数据转换:

select * from table 
where deptno = to_number(a);
如果A包含无法转换为数字的值,这将导致查询失败

更好的解决方案是更改的数据类型,以便调用程序只能传递一个数值。这就把对无用数据的责任推到了它应该属于的地方

最不吸引人的解决方案是保持过程的签名和查询不变,并基于列构建基于函数的索引:

create index emp_deptchar_fbi on emp(to_char(deptno));

阅读文档以了解更多信息

因此,我必须确保查询参数与过程参数同步,以避免长期影响性能。谢谢:)