Oracle 中的 TO_NUMBER 函数出现奇怪的问题

2023-12-06

如果记录数超过特定数量 n,则在 varchar2 列的 where 子句中执行 to_number 函数时,我遇到间歇性问题。我使用 n 是因为没有发生这种情况的确切记录数。在一个 DB 上,它发生在 n 为 100 万之后,而在另一个 DB 上,n 为 0.1。百万。

例如。我有一个包含 1000 万条记录的表,例如 Table 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 函数的这个问题有任何想法吗?


其中 field1 varchar2 包含数字数据

这不是一个好的做法。数字数据应保存在 NUMBER 列中。原因很简单:如果我们不强制执行强数据类型,我们可能会发现 varchar2 列中包含非数字数据。如果发生这种情况,那么像这样的过滤器

where to_number(field1) = 23 

会失败ORA-01722: invalid number.

我不能肯定地说这就是您的场景中发生的情况,因为我不明白为什么 ID 过滤器中明显微不足道的更改会改变查询的成功。查看不同版本的查询的执行计划将会很有帮助。但我认为这更有可能是你的数据问题而不是 SGA 中的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle 中的 TO_NUMBER 函数出现奇怪的问题 的相关文章

随机推荐