Which one of these two sqls - SQL1 and SQL2 will be faster to execute and why -
SQL1:
UPDATE mytable1 A SET A.XC = ( SELECT B.PXC FROM mytable2 B WHERE A.PRCLID=B.PRCLID );
SQL2:
UPDATE mytable1 A SET A.XC = ( SELECT B.PXC FROM mytable2 B WHERE A.PRCLID=B.PRCLID ) where exists( select c.prclid from mytable1 c, mytable2 d where c.prclid = d.prclid);
Or will it take same time to execute?
Or can you please give me tips how to make the first sql run faster?
First, they are not equivalent in functionality. So comparing execution time isn't particularly meaningful.
Second, which will be faster depends on how many rows this sub query returns and if the prclid columns are indexed.
(select c.prclid from mytable1 c, mytable2 d where c.prclid = d.prclid)
If that query returns one row, then SQL2 will probably be faster because it'll quickly find the one row and then update it. Whereas SQL1 ALWAYS updates every row. If it can't find a value it updates to NULL (even if already was NULL or had a value.)
If, on the other hand, the exists subquery returns every id, then it's a waste of time because SQL2 will do the same thing as SQL1 but with extra effort.
David VanZandt
There are many, many, many sources here on E-E, and of course on the Net, of tutorials and examples for statement tuning -- if you want to save your points. Start with Oracle's EXPLAIN_PLAN to learn how to compare execution "cost". See also the comment immediately above, that the tables' indexing and up-to-date statistics are used by the Optimizer to choose the fastest execution available to it.
The Search control in the top right corner is an undervalued friend.
dvz
at999
ASKER
sdstuber,
d o i need this where clause( the one in bold) too ?
UPDATE mytable1 A SET A.XC = ( SELECT B.PXC FROM mytable2 B WHERE A.PRCLID=B.PRCLID ) where exists( select c.prclid from mytable1 c, mytable2 d where c.prclid = d.prclid and c.prclid=a.prclid)
;
Or i dont need - c.prclid=a.prclid
this part is the most confusing
doesn't really add any functionality compared to SQL1
but it does make SQL2 behave differently.
at999
ASKER
how sql2 behave differently ? will it not do what i am trying to do?
Sean Stuber
however, if you're going to add
and c.prclid=a.prclid
to SQL2
then it makes more sense to remove the copy of mytable1 from the subquery
UPDATE mytable1 A SET A.XC = ( SELECT B.PXC FROM mytable2 B WHERE A.PRCLID=B.PRCLID ) where exists( select null from mytable2 d where a.prclid = d.prclid)
So is this better
UPDATE mytable1 A SET A.XC = ( SELECT B.PXC FROM mytable2 B WHERE A.PRCLID=B.PRCLID ) where exists( select null from mytable2 d where a.prclid = d.prclid)
than
UPDATE mytable1 A SET A.XC = ( SELECT B.PXC FROM mytable2 B WHERE A.PRCLID=B.PRCLID ) where exists( select c.prclid from mytable1 c, mytable2 d where c.prclid = d.prclid
and c.prclid=a.prclid)
;
pl guide thanks
MikeOM_DBA
First one is better, second one has redundant join.
UPDATE mytable1 A SET A.XC = ( SELECT B.PXC FROM mytable2 B WHERE A.PRCLID=B.PRCLID ) where exists( select null from mytable2 d where a.prclid = d.prclid)
is better
you only have to read mytable1 once
the other version requires you to read the table twice.
Second, which will be faster depends on how many rows this sub query returns and if the prclid columns are indexed.
(select c.prclid from mytable1 c, mytable2 d where c.prclid = d.prclid)
If that query returns one row, then SQL2 will probably be faster because it'll quickly find the one row and then update it. Whereas SQL1 ALWAYS updates every row. If it can't find a value it updates to NULL (even if already was NULL or had a value.)
If, on the other hand, the exists subquery returns every id, then it's a waste of time because SQL2 will do the same thing as SQL1 but with extra effort.