質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

SqlServer Joinの速度を速くしたい

tusk_rion
tusk_rion

総合スコア11

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

1回答

0グッド

0クリップ

244閲覧

投稿2022/11/25 01:42

前提

「該当のソースコード」に記載しているクエリをSqlServerで実行すると処理速度が遅い時と早い時があります。

実現したいこと

処理速度を速くしたいです。

発生している問題・エラーメッセージ

実際の実行プランは以下のようになっています。
遅い時にはCompute Scalarが行われており、ここで再バインドの推定数が103433となっているためと推測しましたが、Compute Scalarを回避するにはどうしたらよいのか見当がつきません。

  • 速い時の実行プラン

イメージ説明

  • 遅い時の実行プラン

イメージ説明
Joinしているテーブルのレコード件数及び内容は変わっていないのですが、遅くなる原因は何が考えられるでしょうか。
どのようにすればCompute Scalarを回避できるでしょうか。

該当のソースコード

SELECT b.DATA, a.TAG, a.SI_CODE, b.UNIQUE_KEY, a.PG, a.CLM_NO, a.KO_NO, b.TK_KBN_NO, b.TK_KBN_EDA, b.Z_KBN, a.Y_ID, a.CLM_GR FROM LEFT_TBL AS a
LEFT OUTER JOIN(
SELECT HO_XML_ID, Y_VER, KO_NO, CLM_NO, CLM_GR, DATA, SI_CODE, PG_NO, Z_KBN, S_KBN, S_NUM, UNIQUE_KEY, TK_KBN_NO, TK_KBN_EDA FROM RIGHT_TBL WHERE S_KBN = 11 and S_NUM = 0
)AS b
ON
a.Y_ID = b.HO_XML_ID AND
a.SI_CODE = b.SI_CODE AND
a.KO_NO = b.KO_NO AND
a.CLM_GR = b.CLM_GR AND
a.CLM_NO = b.CLM_NO AND
a.S_KBN = b.S_KBN AND
a.S_NUM = b.S_NUM AND
a.PG = b.PG_NO

WHERE a.S_KBN = 11 AND a.S_NUM = 0 AND a.KO_NO <> 0
ORDER BY a.Y_ID, a.SI_CODE, a.PG, a.CLM_GR, a.CLM_NO;

試したこと

  • 主キーの再作成を行っても速度は変わりませんでした。(INDEXは主キーとしているフィールドのみで他のINDEXは存在しません。)
  • LEFT_TBLに別のINDEXを作成しても速度は変わりませんでした。
  • ORDER BY句を外すと格段に速くなりました。

補足情報(FW/ツールのバージョンなど)

SQL Server2019

  • LEFT_TBLの詳細

イメージ説明

  • RIGHT_TBLの詳細

イメージ説明

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

サブクエリをouter joinするのは相当負荷が高い処理になると思います

投稿2022/11/25 01:50

yambejp

総合スコア109141

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

tusk_rion

2022/11/28 05:08

ご回答ありがとうございます。 ご指摘通りサブクエリをやめてテーブルをouter joinしてみましたが、処理速度に変化はみられませんでした。
yambejp

2022/11/28 05:33

outer joinも遅い処理ですがinner joinで代替はできない処理なのでしょうか? 具体的なサンプルデータが無いのでなんとも言えませんが・・・
tusk_rion

2022/11/29 02:58

条件に関わらずLEFT_TBLの全てのレコードを取得したいので、inner joinとするのは難しいですね。
yambejp

2022/11/29 03:03

インデックスをきちんと貼ってもleft joinはそれなりに遅いというだけなので チューニングにも限界はあるでしょう その方針であれば遅さを享受するべきなのかもしれません

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。