在我的后端程序中,我有一个varchar2参数,我在SQL查询中使用它来搜索数字列。这会导致任何性能问题吗?
代表:
Proc (a varchar)
is
select * from table where deptno = a;
end
这里deptno是表中的数字列,a是varchar。
答案 0 :(得分:1)
可能会这样做。数据库将通过将DEPTNO强制转换为VARCHAR2来解决数据类型的差异。这将阻止优化器使用您对该列的任何(正常)索引。根据数据量和分布,索引读取可能并不总是最有效的访问路径,在这种情况下数据转换无关紧要。
所以它确实依赖。但是如果它确实重要(你对该列有一个高度选择性的索引),你有什么选择?
一种解决方案是在查询中应用显式数据转换:
select * from table
where deptno = to_number(a);
如果A包含不会转换为数字的值,则会导致查询失败。
更好的解决方案是更改A的数据类型,以便调用程序只能传递数值。这会将duff数据的责任归于正确的属性。
最不吸引人的解决方案是保持过程的签名和查询不变,并在列上构建基于函数的索引:
create index emp_deptchar_fbi on emp(to_char(deptno));