又是一个优化问题,各位老大看看有什么好方法
有表一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)
问题点数:20、回复次数:6Top
1 楼zheninchangjiang(徐若涵)回复于 2004-05-02 13:30:08 得分 3
这个语句很好呀
试试(应该是一样的效果):
update tbl_message set area=b.area from tbl_message a join tbl_hlrarea b on
b.hlr=substring(a.hlr,1,10)Top
2 楼zjcxc(邹建)回复于 2004-05-02 14:13:54 得分 3
--试试:
update tbl_message set area=b.area
from tbl_message a,tbl_hlrarea b where
charindex(b.hlr,a.hlr)=1
Top
3 楼shiming25(shim)回复于 2004-05-03 14:02:33 得分 0
可是这条语句确是有点慢,刚开始我也是用zjcxc的写法,可是那样的话更慢啊,因为那样的话就用不到建立在tbl_hlrarea中hlr上的索引了。关键是我那个大表中tbl_message用到了substring函数,这样这个表上面的索引就不起作用了。有没有其他的方法啊!
Top
4 楼SoarInAir(亮子)回复于 2004-05-03 15:06:32 得分 14
试一下用like
update tbl_message set area=b.area from tbl_message a,tbl_hlrarea b where
a.hlr like b.hlr+'%'
Top
5 楼shiming25(shim)回复于 2004-05-03 16:38:00 得分 0
使用这种写法的话,我就不能控制他的字符个数了啊!比如我b.hlr有12345和1234567890这样的话执行更新的话启不是不知道是用哪一个更新的啊!
Top
6 楼shiming25(shim)回复于 2004-05-03 16:51:37 得分 0
哦,对了我可不可以这样,由于表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+'%'Top




