Re: Optimizer question
From: Delbert Glass (delbert_at_noincoming.com)
Date: 03/19/04
- Next message: Aaron Bertrand [MVP]: "Re: Different Row Counts From Two Virtually Identical Queries"
- Previous message: David Browne: "Re: create a global procedure"
- In reply to: Hugo Kornelis: "Optimizer question"
- Next in thread: Hugo Kornelis: "Re: Optimizer question"
- Reply: Hugo Kornelis: "Re: Optimizer question"
- Messages sorted by: [ date ] [ thread ]
Date: Fri, 19 Mar 2004 10:55:19 -0600
(untested)
Eliminating the question:
UPDATE ToBeChanged SET
Column1 = 'Something'
WHERE EXISTS (
SELECT *
FROM Table2
WHERE EXISTS (
SELECT *
FROM Table3
WHERE Table3.Column2 = Table2.Column3
AND Table3.Column4 = ToBeChanged.Column5
)
AND NOT EXISTS (
SELECT *
FROM Table3
WHERE Table3.Column2 = Table2.Column3
AND Table3.Column4 = ToBeChanged.Column5
AND Table3.Column6 IS NOT NULL
)
)
Being tricky might be faster:
UPDATE ToBeChanged SET
Column1 = 'Something'
WHERE EXISTS (
SELECT *
FROM Table2
WHERE EXISTS (
SELECT COUNT(*)
FROM Table3
WHERE Table3.Column2 = Table2.Column3
AND Table3.Column4 = ToBeChanged.Column5
HAVING COUNT(*) = COUNT(Table3.Column6)
AND COUNT(*) > 0
)
)
Twisting that around might be even faster:
UPDATE ToBeChanged SET
Column1 = 'Something'
WHERE EXISTS (
SELECT COUNT(*)
FROM Table3
WHERE Table3.Column4 = ToBeChanged.Column5
AND EXISTS (
SELECT *
FROM Table2
WHERE Table2.Column3 = Table3.Column2
)
HAVING COUNT(*) = COUNT(Table3.Column6)
AND COUNT(*) > 0
)
But as Karl mentioned, "It depends!"
(
Note, the first of the three is the easiest
for a reader to understand of the four.
)
Bye,
Delbert Glass
"Hugo Kornelis" <hugo@pe_NO_rFact.in_SPAM_fo> wrote in message
news:luhl50tgstcl7suem8mbb44cutb4pu61hd@4ax.com...
> I'm using MS SQL Server 2000. Suppose I have a query like this:
>
> (1) UPDATE ToBeChanged
> (2) SET Column1 = 'Something'
> (3) WHERE EXISTS
> (4) (SELECT *
> (5) FROM Table2
> (6) INNER JOIN Table3
> (7) ON Table3.Column2 = Table2.Column3
> (8) AND Table3.Column4 = ToBeChanged.Column5
> (9) AND NOT EXISTS
> (10) (SELECT *
> (11) FROM Table3 AS T3Inner
> (12) WHERE T3Inner.Column2 = Table2.Column3
> (13) AND T3Inner.Column4 = ToBeChanged.Column5
> (14) AND T3Inner.Column6 IS NOT NULL))
>
> (Line numbers are added for easy referral; they're not part of the
> query)
>
> Because of the join condition in lines 7 and 8, I could change lines
> 12 and 13 to:
>
> (12b) WHERE T3Inner.Column2 = Table3.Column2
> (13b) AND T3Inner.Column4 = Table3.Column4
>
> and still get the same results. I can only make this change on only
> one of these lines.
>
> Is this an execution strategy that the query optimizer will consider
> or should I try both variations in situations similar to the one
> described here?
>
> (Note: Similar situations also often arise when joining more than two
> tables.)
>
> Best, Hugo
> --
>
> (Remove _NO_ and _SPAM_ to get my e-mail address)
- Next message: Aaron Bertrand [MVP]: "Re: Different Row Counts From Two Virtually Identical Queries"
- Previous message: David Browne: "Re: create a global procedure"
- In reply to: Hugo Kornelis: "Optimizer question"
- Next in thread: Hugo Kornelis: "Re: Optimizer question"
- Reply: Hugo Kornelis: "Re: Optimizer question"
- Messages sorted by: [ date ] [ thread ]