过程参数和sql查询里面的数据类型区别

时间:2013-07-04 12:13:50

标签: oracle plsql query-optimization data-conversion

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

代表:

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

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

1 个答案:

答案 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));

阅读文档find out more about function-based indexes