我在执行to_number函数时,遇到了一个间歇性问题,当varchar2列中的记录数超过某个数量n时,在where子句中使用该函数会出现问题。我使用n是因为没有确切的记录数可以确定。在一个数据库上,当n为100万时发生,在另一个数据库上,当n为10万时发生。
例如,我有一个包含1000万条记录的表,名为Country,其中有一个名为field1的varchar2字段,包含数字数据和Id。
如果我进行查询,如下所示:
select *
from country
where to_number(field1) = 23
and id >1 and id < 100000
这个是有效的
但如果我执行查询
select *
from country
where to_number(field1) = 23
and id >1 and id < 100001
它失败了,显示无效数字。
接下来我尝试查询。
select *
from country
where to_number(field1) = 23
and id >2 and id < 100001
它又可以工作了
由于我只得到了无效的数字,所以很困惑,但在日志文件中它说:
Memory Notification: Library Cache Object loaded into SGA
Heap size 3823K exceeds notification threshold (2048K)
KGL object name :with sqlplan as (
select c006 object_owner, c007 object_type,c008 object_name
from htmldb_collections
where COLLECTION_NAME='HTMLDB_QUERY_PLAN'
and c007 in ('TABLE','INDEX','MATERIALIZED VIEW','INDEX (UNIQUE)')),
ws_schemas as(
select schema
from wwv_flow_company_schemas
where security_group_id = :flow_security_group_id),
t as(
select s.object_owner table_owner,s.object_name table_name,
d.OBJECT_ID
from sqlplan s,sys.dba_objects d
看起来与SGA大小有关,但谷歌并没有给我太多帮助。
有人对TO_NUMBER或用于大数据的Oracle函数的这个问题有什么想法吗?