gpt4 book ai didi

sql - Oracle SQL Where 条件比较 varchar2 字段与数字或字符串

转载 作者:行者123 更新时间:2023-12-04 00:46:54 33 4
gpt4 key购买 nike

我有两个包含以下列的表:

Table1
{ ID NUMBER(15),
ROLL_NUM VARCHAR2(9),
BATCH_NUM VARCHAR2(6),
ACCT_BALANCE NUMBER(15,2)
}

Table2
{ Table1_ID NUMBER(15) REFERENCES TABLE1.ID,
SEQ_NUM NUMBER(2),
TRANS_NUM VARCHAR2(10),
TRANS_AMT NUMBER(8,2),
TRANS_DT DATE
}

表1有20万条记录,表2有50万条记录

我有如下简单的连接:

SQL #1:

SELECT A.ROLL_NUM, A.ACCT_BALANCE, B.TRANS_NUM, TRANS_AMT, TRANS_DT
FROM TABLE1 A, TABLE2 B
WHERE B.Table1_ID = A.ID
AND A.BATCH_NUM = 400012

SQL #2:

SELECT A.ROLL_NUM, A.ACCT_BALANCE, B.TRANS_NUM, TRANS_AMT, TRANS_DT
FROM TABLE1 A, TABLE2 B
WHERE B.Table1_ID = A.ID
AND A.BATCH_NUM = '400012'

SQL #3:

SELECT A.ROLL_NUM, A.ACCT_BALANCE, B.TRANS_NUM, TRANS_AMT, TRANS_DT
FROM TABLE1 A, TABLE2 B
WHERE B.Table1_ID = A.ID
AND A.BATCH_NUM = TO_NUMBER('400012')

如果表 1 中的每个 BATCH_NUM 都是“400012”并且表 2 中的所有 ID 都匹配,则计数的预期结果应该是 500,000。

当我在 Oracle(v11 或 v10)中运行这些查询时,SQL #2 似乎要花很长时间,我不得不在 10 到 15 分钟后停止运行查询。 SQL#1 和#3 似乎在不到一秒的时间内立即返回了完整的 500,000 条记录的结果。起初,我认为这是一个索引问题,但是添加索引并不能解决问题。我在 TOAD 和 SQL Developer 中尝试了这个查询,结果相同。

我在这里不知所措,因为表 1 中的 BATCH_NUM 列是 VARCHAR2,您可能认为数据类型的隐式转换会导致查询变慢,而不是比未转换的比较快。有人可以解释一下吗?

最佳答案

我同意使用隐式转换会阻止索引访问路径。

要确定真正发生了什么,请执行以下操作:

explain plan for
select ......
/

然后,紧接着,做:

select * from table(dbms_xplan.display);

并发布结果。

如果不看执行计划,我说的任何话都是猜测。

哦,请发布表中存在的所有索引的定义。

-标记

关于sql - Oracle SQL Where 条件比较 varchar2 字段与数字或字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7735845/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com