Table1(SFZHM,SGJL,JWH)
Table2(SFZHM,,JWH)
Table1有记录486000条,Table2有记录1000条.
Table1和Table2都把SFZHM设为索引.
(1)用Pul Sql执行选择语句.
Select Table1.SFZHM,Table2.JWH From Table1,Table2
Where Table1.SFZHM=Table2.SFZHM;
很快就把查询到的44条记录列了出来.
(2)用Pul Sql执行更新语句.
Update Table1 Set Jwh=(Select Jwh From Table2
Where Table1.SFZHM=Table2.SFZHM);
结果很久也没有执行的结果,象是死机一样。
是为什么呢?数据量太大?哪为什么选择语句就这么快?
请各位指教指教,怎样才能提高Update的处理速度,多谢!
Table2(SFZHM,,JWH)
Table1有记录486000条,Table2有记录1000条.
Table1和Table2都把SFZHM设为索引.
(1)用Pul Sql执行选择语句.
Select Table1.SFZHM,Table2.JWH From Table1,Table2
Where Table1.SFZHM=Table2.SFZHM;
很快就把查询到的44条记录列了出来.
(2)用Pul Sql执行更新语句.
Update Table1 Set Jwh=(Select Jwh From Table2
Where Table1.SFZHM=Table2.SFZHM);
结果很久也没有执行的结果,象是死机一样。
是为什么呢?数据量太大?哪为什么选择语句就这么快?
请各位指教指教,怎样才能提高Update的处理速度,多谢!
Update Table1 Set Jwh=(Select Jwh From Table2
Where Table1.SFZHM=Table2.SFZHM);没有对其做限制,更新的时候从第一条开始执行486000次,每次都去找,就比较慢
加上一个限制不:
Update Table1 Set Jwh=(Select Jwh From Table2
Where Table1.SFZHM=Table2.SFZHM)
where Table1.SFZHM in (
Select Table1.SFZHM Where Table1.SFZHM=Table2.SFZHM;
);
不知道这个怎么样,你试验一下
根据Oracle优化路径
rule 模式下的规则:1、有两个索引存在的情况下,from后面大表在前。小表(返回记录少的表,不是记录少的表)在最后,作为驱动表,Oracle处理SQL语句是从左到右2、有一个索引,则顺序无关3、都没有索引,则大表应该在后
要根据有无索引,详细如下:表A有N行数据,符合连接条件的行树为A1,表B有M行数据,符合连接条件的行树为B1
1.A,B两表均无索引
如果A表驱动,则A表扫描一次,B表扫描A1次. 磁盘访问次数为:N+A1*M;
如果B表驱动,则B表扫描一次,A表扫描B1次. 磁盘访问次数为:M+B1*N;
2.A表无索引,B表有索引
如果A表驱动,则A表扫描一次,B表查A1次索引. 磁盘访问次数为:N+A1*LOG(M)/LOG(2);
如果B表驱动,则B表查一次索引,A表扫描B1次. 磁盘访问次数为:LOG(M)/LOG(2)+B1*N
3.A表有索引,B表无索引
如果B表驱动,则B表扫描一次,A表查B1次索引. 磁盘访问次数为:M+B1*LOG(N)/LOG(2);
如果A表驱动,则A表查一次索引,B表扫描B1次. 磁盘访问次数为:LOG(M)/LOG(2)+B1*N
4.A,B表均有索引
如果A表驱动,则A表查一次索引,B表查A1次索引.
磁盘访问次数:LOG(M)/LOG(2)+A1*LOG(N)/LOG(2);
如果B表驱动,则B表查一次索引,A表扫描B1次.
磁盘访问次数为:B1*LOG(M)/LOG(2)+LOG(N)/LOG(2)
Update Table1 Set Jwh=(Select Jwh From Table2
Where Table1.SFZHM=Table2.SFZHM);
查询:Select Jwh From Table2
Where Table1.SFZHM=Table2.SFZHM);
可那为一个集合
而你却用的是:jwh=
你把"=" 换成in 试一下
Where Table1.SFZHM=Table2.SFZHM)
where Table1.SFZHM ='442562565875848';也是这么慢,不如用游标逐条更新,各位有何看法!
Update Table1
Set Jwh=(Select Jwh From Table2 Where Table1.SFZHM=Table2.SFZHM)
where sfzhm=(select sfzhm From Table2 Where Table1.SFZHM=Table2.SFZHM);
Where Table1.SFZHM=Table2.SFZHM)
我认为有问题。由于每一次都要查询Table2这个表,所以会很慢。
另外,如果不是对SFZHM建立唯一索引,可能出错。如果不是非要一次性写完,可以食用游标,会很快的。
Update Table1
Set Jwh=(Select Jwh From Table2 Where Table1.SFZHM=Table2.SFZHM)
where sfzhm=(select sfzhm From Table2 Where Table1.SFZHM=Table2.SFZHM);
的写法,效率可以提高不少。 另外,如果字段jwh 有索引最好删除,然后再建立。
Select Table1.SFZHM,Table2.JWH
From Table1,Table2
Where Table1.SFZHM=Table2.SFZHM;
非常快,则建一个view
create view view1 as
Select Table1.SFZHM,Table2.JWH
From Table1,Table2
Where Table1.SFZHM=Table2.SFZHM;
应该快,
再UPDATE。如何。
Update Table1 Set Jwh=(Select Jwh From Table2
Where Table1.SFZHM=Table2.SFZHM
and rownum<=1);
试一下,
和下面的贴子类似:
http://expert.csdn.net/Expert/topic/2172/2172979.xml?temp=.3545191
建议看一下