【请问】从两个相关表update其中一个表的两个字段,效率很低,两个小时了,还没结束,为什么?(各有数据50w/10w)

outwindows 2006-03-16 02:25:19
为什么下面的SQL语句执行N慢,有没有效率更高的办法,谢谢各位大虾.
1.SQL语句如下:
---------------------------------------------------------------
update new_Table a
set (a.AreaId,a.TypeId) = (select b.AreaId,b.TypeId
from DataTable b
where substr(trim(a.Col),1,length(trim(b.Num))) = trim(b.Col));

2.表结构如下:
---------------------------------------------------------------
new_Table 有50w左右数据,DataTable 有近10w数据,
new_Table.Col 前面的几位值与 DataTable.Num关联(相等).

3.表结构如下:
---------------------------------------------------------------
-- ============================================================
-- Table: new_Table
-- ============================================================
create table new_Table
(
Col CHAR(15) not null,--数据位数>9
AreaId CHAR(6) null ,
CardTypeId CHAR(6) not null,
constraint PK_NEW_TABLE primary key (Col)
)
/

-- ============================================================
-- Table: DataTable
-- ============================================================
create table DataTable
(
Num CHAR(15) not null,--数据位数固定为3/4/7
AreaId CHAR(6) null ,
CardTypeId CHAR(6) not null,
constraint PK_DATATABLE primary key (Num)
)
/
...全文
156 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cenlmmx 2006-03-16
  • 打赏
  • 举报
回复
那么多trim,还不如先update table set col=trim(col)再update
然后可以考虑建function index(length(b.Num))和普通索引col
开发者开聊 2006-03-16
  • 打赏
  • 举报
回复
常规的B树索引
对你的查询应给是没用的
开发者开聊 2006-03-16
  • 打赏
  • 举报
回复
CREATE INDEX SCOTT.EMP_I ON SCOTT.EMP (substr(ename,1,11));
CREATE INDEX SCOTT.EMP_2 ON SCOTT.EMP (trim(ename));

可以尝试建立函数索引
霖湘凝 2006-03-16
  • 打赏
  • 举报
回复
晕,看看你的时间复杂度,不慢怎么可能呢,哈哈
楼上说的建索引,要不就建立中间表。。。。。。
outwindows 2006-03-16
  • 打赏
  • 举报
回复
3ks
go on ...
skying1 2006-03-16
  • 打赏
  • 举报
回复
substr(trim(a.Col),1,length(trim(b.Num))) = trim(b.Col))
此句检索的数据量太大,优化你的SQL,建立适当索引.

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧