データベースには、30 列の 2 つのテーブルを where 条件で結合してテーブルを更新するストアド プロシージャがあります。SQL の一般的な形式は次のとおりです。
UPDATE Target
SET col1 = Source.col1
INNER JOIN Source
on
ISNULL(Target.Col2, '') = ISNULL(Source.Col2, '') and
ISNULL(Target.Col3, '') = ISNULL(Source.Col3, '') and
.
.
.
ISNULL(Target.Col31, '') = ISNULL(Source.Col31, '') and
これがクエリプランです。それを PC に保存し、再度開くと、より適切にスケーリングされます。
ソース テーブルには 65M のレコードがあり、ターゲットには 165M のレコードがあります。以前は、かなりの数分で実行されていました。クエリがどれほど醜く、潜在的に非効率的であるかを考えると、これは驚くべきことです。今月は 1.5 時間実行され、プロセッサが 100% 使用されたため、強制終了する必要がありました。
以下のクエリを即興で実行し、時間通りに実行する方法について何か提案はありますか?
30 列の結合条件で使用されるいくつかの列に単一列のインデックスがあります。
私は ISNULL 関数と 30 列の結合がおかしいことを知っています。これは悪い設計です。私を責めないでください、私はこの経済を継承しました。
残念ながら、再設計の時間はありません。助言がありますか?