在我的后端程序中,我有一个 varchar2 参数,我在 SQL 查询中使用它来搜索数字列。这会导致任何性能问题吗?
例如:
Proc (a varchar)
is
select * from table where deptno = a;
end
这里 deptno 是表中的数字列, a 是 varchar 。
在我的后端程序中,我有一个 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 包含不会转换为数字的值,这将导致查询失败。
更好的解决方案是更改 A 的数据类型,以便调用程序只能传递一个数值。这引发了对正确所属的 duff 数据的责任。
最不吸引人的解决方案是保持过程的签名和查询不变,并在列上构建基于函数的索引:
create index emp_deptchar_fbi on emp(to_char(deptno));
阅读文档以了解有关基于函数的索引的更多信息。