レコード数が特定の数nを超えると、varchar2列のwhere句でto_number関数を実行すると、断続的な問題が発生します。nを使用したのは、それが発生するレコードの正確な数がないためです。あるDBでは、nが0.1のときに別のDBで100万になった後に発生します。100万。
たとえば、1,000万件のレコードを含むテーブルがあり、数値データとIDを含むfield1varchar2があるTableCountryと言います。
例としてクエリを実行すると
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関数に関するこの問題について誰かが知っていますか?