0

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

例如:

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

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

4

1 回答 1

1

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

所以它确实取决于。但是,如果它确实重要(您在该列上有一个高度选择性的索引),您有什么选择?

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

select * from table 
where deptno = to_number(a);

如果 A 包含不会转换为数字的值,这将导致查询失败。

更好的解决方案是更改 A 的数据类型,以便调用程序只能传递一个数值。这引发了对正确所属的 duff 数据的责任。

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

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

阅读文档以了解有关基于函数的索引的更多信息

于 2013-07-04T12:19:35.040 回答