MERGE INTO t_biz_storesalestock t USING tmp_purchase_receive_interface p ON (p.store = t.orgid AND t.productid = p.material) WHEN MATCHED THEN UPDATE SET t.receivedate = p.receivedate where t.saleinventorydate = pdate_date and t.orgid = c_row.orgid and p.receivedate is not null;
如上一条SQL,用于 根据另一个表更新主表,可是慢的简直无法让人忍受。还不如我把 t 表中要更的记录和 p 表关联起来插入临时表,然后把 t 表中相应记录删除,在把临时表中数据插回来快。这是为什么呢?按说这样做加起来都做了3个增删1个查询加起来4个操作了,应该更慢啊,可现在反而比我上面的这个简单的更新快的多。
请 @宏哥 指点。其实我的需求很简单的,写成简单的SQL就是:
update t_biz_storesalestock t set t.receivedate = (select p.receivedate from tmp_purchase_receive_interface p where p.store = t.orgid AND t.productid = p.material and p.receivedate is not null) where t.saleinventorydate = pdate_date and t.orgid = c_row.orgid;
这样写而已。可是无论我怎么写,它还是慢啊,我现在要它快点啊。。
@宏哥 怎么老at不到啊。
这得看数据量了,几十万以下,加个索引就可以搞定了。几十百万以上的话,无论是update还是delete都是不推荐的,一般用ctas建临时表,再将原本未更新的数据补进临时表,删除原表,把临时表改名为原表名。
######看一下执行计划,是不是没走索引######哈,谢谢回答,是那个来源表里没索引,我已经加了,现在很快就能执行完,嘿嘿,不过你回答的晚了。我已经设置了最佳答案咯。###### @宏哥 知道这大龄屌丝数据库方面很就X,怎么就是在上面提问里面@不到呢,继续 @宏哥 一下。你这语句能执行?
c_row哪来的
pdate_date是哪来的
还有就是没有执行计划没办法分析的
你这语句能执行?
c_row哪来的
pdate_date是哪来的
还有就是没有执行计划没办法分析的
为什么你不拆开来分析一下到底是哪个条件导致这么慢?
建议你把中间select语句的执行计划拿出来看一下~还有表的结构跟表大小~
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。