on 2010 Nov 11 4:18 PM
We have a very repetitive need to execute UPDATE commands in our Database where only one table is updated, but two additional tables need to be referenced. I've been doing SQL for a long time, but have always seemed to just stick with the basics. I've never used JOINs before. Indexes aside, I'm thinking my SQL in general is inefficient and was hoping if someone could let me know if they think Statement 2 below is not only identical to Statement 1 (currently using this format), but is also more efficient?
Statement 1
UPDATE TABLE_A, TABLE_V, TABLE_L
SET TABLE_A.COL_1 = TABLE_V.COL_3
WHERE TABLE_A.COL_2 = 'ABC'
AND TABLE_L.COL_6 = 'ABC'
AND TABLE_A.COL_1 = TABLE_V.COL_4
AND TABLE_L.COL_7 = TABLE_V.COL_5
AND TABLE_L.COL_8 = TABLE_V.COL_4;
Statement 2
UPDATE A
SET COL_1 = COL_3
FROM TABLE_A AS A
JOIN TABLE_V AS V ON A.COL_1 = V.COL_4
JOIN TABLE_L AS L ON (L.COL_7 = V.ID AND L.COL_8 = V.COL_4)
WHERE COL_2 = 'ABC' AND COL_6 = 'ABC';
Any help would be greatly appreciated 🙂
Anthony Mangione (amangione@jatsoftware.com)
To be semantically equivalent, the second query should read
UPDATE Table_A as A
SET COL_1 = COL_3
FROM TABLE_A AS A
JOIN TABLE_V AS V ON A.COL_1 = V.COL_4
JOIN TABLE_L AS L ON (L.COL_7 = V.COL_5 AND L.COL_8 = V.COL_4)
WHERE COL_2 = 'ABC' AND COL_6 = 'ABC';
As you surmised, the two UPDATE statements are semantically equivalent (if the latter is rewritten as above). They are also both optimized in exactly the same way - neither will be more efficient than the other.
You can determine the access plan used by either statement by viewing the graphical plan for the statement via DBISQL (SHIFT+F5). To improve performance, appropriate indexes may need to be defined on the columns involved in joining the three tables together, or as well on one or both of COL_2 and COL_6 to efficiently support the comparisons with the string literals "ABC".
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
75 | |
10 | |
10 | |
10 | |
10 | |
9 | |
8 | |
7 | |
5 | |
5 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.