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

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

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

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

Q&A

解決済

1回答

2986閲覧

SqlServer Joinの速度を速くしたい

tusk_rion

総合スコア11

SQL Server

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

0グッド

0クリップ

投稿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の詳細

イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

投稿2022/11/25 01:50

yambejp

総合スコア116214

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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はそれなりに遅いというだけなので チューニングにも限界はあるでしょう その方針であれば遅さを享受するべきなのかもしれません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問