- PR -

SQLのパフォーマンス (結合 vs 副文)

1
投稿者投稿内容
きのこ
ぬし
会議室デビュー日: 2004/09/01
投稿数: 256
投稿日時: 2006-11-13 03:43
現在、SQL 2005にてSSISで夜間バッチでながそうとしている
SQLのJOBがあるのですが、結構時間がかかり
解析したところ(作成者は私と別人ですでに会社を去っています)

以下のように、あるテーブルをUPDATEするのに
自分自身を呼び出して以下のように処理してました

====SQL1====
UPDATE SALES_HISTORY
SET VALID_FLAG='Y'
FROM (
SELECT ID FROM TMP_SALES_HISTORY
) A
WHERE SALES_HISTORY.ID= A.ID

===SQL2===
UPDATE SALES_HISTORY
SET VALID_FLAG='Y'
FROM (
select min(ID) ID, SALES_NUMBER ,SITEN_KEY
from SALES_HISTORY
group by SALES_NUMBER,SITEN_KEY
having count(SALES_NUMBER) = 1
) A
WHERE SALES_HISTORY.ID= A.ID

これらは複文にしてしまったほうがいいのではと思ってます
よくみると結局、selectをはしらせているので

SQL1は
UPDATE SALES_HISTORY
SET VALID_FLAG='Y'
WHERE SALES_HISTORY.ID 
in
(SELECT ID FROM TMP_SALES_HISTORY)


SQL2は

UPDATE SALES_HISTORY
SET VALID_FLAG='Y'
WHERE SALES_HISTORY.ID in
(select min(ID) ID
from SALES_HISTORY
group by SALES_NUMBER,SITEN_KEY
having count(SALES_NUMBER) = 1
)

のような感じですが、普通副文(サブクエリー)をつかうほうがおそくなるという
のはきいたことはありますが、上記のようなケースではどうなのでしょうか?
アドバイスいただけると幸いです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-13 09:52
引用:

きのこさんの書き込み (2006-11-13 03:43) より:

普通副文(サブクエリー)をつかうほうがおそくなるというのはきいたことはありますが、上記のようなケースではどうなのでしょうか?


実際に試せば良いのではないでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-11-13 10:00
ボトルネックがどこにあるのか検証していない段階で、どちらが速いかどうか、という
議論をするのはあまり意味がありません。ですので、まず検証してみることです。

それはそれとして、SQLとしては後者の方が自然だと思います。ただin句よりはexists
句を使ったほうがいいと思いますが。
1

スキルアップ/キャリアアップ(JOB@IT)