又是一个优化问题,各位老大看看有什么好方法

shiming25 2004-05-02 01:07:14
有表一tbl_message,表二tbl_hlrarea
其中表一100万条记录,表二3万条记录
我现在要根据表二对表一进行更新操作,在表二中建有索引(hrl上)
下面这条语句会执行很慢,各位有没有好的写法。

update tbl_message set area=b.area from tbl_message a,tbl_hlrarea b where
b.hlr=substring(a.hlr,1,10)
...全文
35 6 点赞 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
shiming25 2004-05-03
哦,对了我可不可以这样,由于表b.hlr比较小我先取出符合条件的记录,比如:
select * into # tmp_p from tbl_hlrarea where len(hlr)=10
(这句话hlr索引好象就不起作用了,有没有其他的选择方法呢)

create index on #tmp_p(hlr)

然后:按照亮子大虾的方法:

update tbl_message set area=b.area from tbl_message a,#tbl_p where
a.hlr like b.hlr+'%'
  • 打赏
  • 举报
回复
shiming25 2004-05-03
使用这种写法的话,我就不能控制他的字符个数了啊!比如我b.hlr有12345和1234567890这样的话执行更新的话启不是不知道是用哪一个更新的啊!
  • 打赏
  • 举报
回复
SoarInAir 2004-05-03
试一下用like

update tbl_message set area=b.area from tbl_message a,tbl_hlrarea b where
a.hlr like b.hlr+'%'
  • 打赏
  • 举报
回复
shiming25 2004-05-03
可是这条语句确是有点慢,刚开始我也是用zjcxc的写法,可是那样的话更慢啊,因为那样的话就用不到建立在tbl_hlrarea中hlr上的索引了。关键是我那个大表中tbl_message用到了substring函数,这样这个表上面的索引就不起作用了。有没有其他的方法啊!
  • 打赏
  • 举报
回复
zjcxc 元老 2004-05-02
--试试:

update tbl_message set area=b.area
from tbl_message a,tbl_hlrarea b where
charindex(b.hlr,a.hlr)=1
  • 打赏
  • 举报
回复
zheninchangjiang 2004-05-02
这个语句很好呀
试试(应该是一样的效果):
update tbl_message set area=b.area from tbl_message a join tbl_hlrarea b on
b.hlr=substring(a.hlr,1,10)
  • 打赏
  • 举报
回复
相关推荐
发帖
MS-SQL Server
加入

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2004-05-02 01:07
社区公告
暂无公告