免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jack9981
打印 上一主题 下一主题

我这条语句跑了5个半小时啊,高手帮忙优化一下。 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-09-11 11:12 |只看该作者
原帖由 numenhuang 于 2007-9-11 11:07 发表
现在的进展如何

如果这个表此时没有并发访问,也可以考虑使用rowid

in和exists差别就在于这个子查询如何返回结果
in 会扫描所有符合条件的结果
exists找到第一条匹配的结果就返回


这样对于20万条记录,效率就差很多了, in需要线性查找, exist 2分查找即可。
我试验一下

论坛徽章:
0
22 [报告]
发表于 2007-09-11 11:16 |只看该作者
我建议你还是先创建临时表,这样不管更新有索引字段还是无索引字段,都是可以利用两张表的主键索引(建临时表的意义就在于此)。如果不使用临时表,那最好利用rowid。

看一下语句的执行规划

论坛徽章:
0
23 [报告]
发表于 2007-09-11 13:03 |只看该作者

另一种思路

如果真的有4000多条记录可将二个表数据导出,用python写一脚本,更新对应值,再插入 ,这样肯定很快

论坛徽章:
0
24 [报告]
发表于 2007-09-11 13:29 |只看该作者
不是唯一的也可以建索引啊.

论坛徽章:
0
25 [报告]
发表于 2007-09-11 14:29 |只看该作者
原帖由 numenhuang 于 2007-9-11 11:16 发表
我建议你还是先创建临时表,这样不管更新有索引字段还是无索引字段,都是可以利用两张表的主键索引(建临时表的意义就在于此)。如果不使用临时表,那最好利用rowid。

看一下语句的执行规划


我没明白,修建的临时表是参数表chg, 对于数据表org中的数据不是索引字段,又怎么利用主键索引?
谢谢

论坛徽章:
0
26 [报告]
发表于 2007-09-11 14:30 |只看该作者
原帖由 haha1118 于 2007-9-11 13:29 发表
不是唯一的也可以建索引啊.

不敢建,出错了偶吃不了兜子走。

论坛徽章:
0
27 [报告]
发表于 2007-09-11 14:38 |只看该作者
原帖由 jack9981 于 2007-9-11 14:29 发表


我没明白,修建的临时表是参数表chg, 对于数据表org中的数据不是索引字段,又怎么利用主键索引?
谢谢


看看前面我写的语句

论坛徽章:
0
28 [报告]
发表于 2007-09-11 16:10 |只看该作者
留个记号!

论坛徽章:
0
29 [报告]
发表于 2007-09-11 18:14 |只看该作者

语句有问题吧.

我建议用这样的修改语句形式吧.update org set org.old_acc=chg.new_acc where org.old_acc=chg.old_acc

[ 本帖最后由 pqc4391 于 2007-9-11 18:16 编辑 ]

论坛徽章:
0
30 [报告]
发表于 2007-09-11 19:31 |只看该作者
你几乎用了最慢的办法更新
应该使用:
update org set org.old_acc = chg.new_acc
from org
where chg.old_acc = org.old_acc
T-SQL语句大致就是这样的啦,Oracle数据库你看一下参考吧

修改一下,下面的连接应该是标准办法:
http://textsnippets.com/posts/show/277

[ 本帖最后由 SuperZ 于 2007-9-11 19:44 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP