SQL
1SELECT A.代理店コード, F.代理店名, A.お客様コード, G.お客様名 2FROM トランザクション A 3LEFT OUTER JOIN NDSS.[dbo].[代理店マスタ] F ON F.代理店コード=A.代理店コード 4LEFT OUTER JOIN NDSS.[dbo].[お客様マスタ] G ON G.お客様コード=A.お客様コード 5WHERE (F.代理店コード IS NOT NULL AND F.削除フラグ<>'D') AND (G.お客様コード IS NOT NULL AND G.削除フラグ<>'D')
Aをベースに、関連づけられた参照マスタ2種類がある発行ですが
・参照マスタ側は 必ずしもAに関連づけられた レコードがあるとは 限らない
・どちらかの参照マスタで、削除が宣言されていたら、発行結果=行を得ない
要件を達成したく、現況上記のようなSQL文になっています。
しかし 結構スピードが遅く感じています。
###質問
SQL
1SELECT X.代理店コード, X.代理店名, X.お客様コード, X.お客様名 FROM 2(SELECT A.代理店コード, F.代理店名, ■F.削除フラグ AS 削除フラグF, A.お客様コード, G.お客様名, ■G.削除フラグ AS 削除フラグG 3FROM トランザクション A 4LEFT OUTER JOIN NDSS.[dbo].[代理店マスタ] F ON F.代理店コード=A.代理店コード 5LEFT OUTER JOIN NDSS.[dbo].[お客様マスタ] G ON G.お客様コード=A.お客様コード)) X 6WHERE (X.削除フラグF<>'D') AND (X.削除フラグG<>'D')
上記のようにSQL文を組みなおすことで スピード向上は 期待できるのでしょうか? <==== スピード向上が果たされるとしても
削除フラグを含めるためだけに 元のSQL文をまるっと 副問い合わせにするような手立てが 恥ずかしい解決策でないか
不安に思いましたので 本問い合わせに至りました
ご見解いただけたら 幸いです。
SQLもDBの種類によって機能や性能に差があります。
また、テーブル定義にも影響します。
想定されている環境、テーブル定義 提示してください。
パフォーマンス向上を目指す場合、総合的な観点で対応する必要があり、
可能なら定義から見直した方が良いと思います。
> 上記のようにSQL文を組みなおすことで スピード向上は 期待できるのでしょうか?
自分で試してみようと思わず質問しているのであればガイドラインに反してます。
https://teratail.com/help/question-tips#questionTips1-2
「投稿前に検索し、できるところまで自分でやってみましょう」
DBの種類が何か分かりませんが、直接SQLを実行して試してみれば直ぐ分かるので
まずご自分で試して下さい。
ひとまず MicrosoftのSQLServerです。
スピード以前 非常識なことを対応方針か否か 知りたくて 問い合わせたところが大きいです。
質問本文調整してください。
リファクタリングやパフォーマンスチューニングは前提として「以前と同じ動作結果を得られること」です。
「スピードが遅い」だけでは感覚だけでしかないので、実行計画や速度を数値ではかったうえで「何を目指すか」を決めて(ゴールのこと)やっていかないと、やろうと思えばどこまでもできてしまう(つまり「ベスト」などない)ものです。
許容範囲やラインを決めてください。
m.ts10806さん、ご見解ありがとうございます。
自分が作成したSQL文を 第3者が確認された際に 非常識と思われるといやだなぁと思いまして、スピードが速かったとしても 自分の案は 採用すべきでないな、ほかに案はあるかな、と思ったのです。
「想定通りに動く」なら非常識も何もないのでは。
結局プログラムは書いたとおりにしか動かないわけですし。
>上記のようにSQL文を組みなおすことで スピード向上は 期待できるのでしょうか?
><==== スピード向上が果たされるとしても
>削除フラグを含めるためだけに 元のSQL文をまるっと 副問い合わせにするような手立てが
>恥ずかしい解決策でないか
>不安に思いましたので 本問い合わせに至りました
おかしな文章ですね、まず組み立て直したSQLを実行してスピード向上していることを確認した後に
その方法が妥当かどうかを気にするべきではありませんか???
もし逆にスピードが遅くなっていたらそれは間違った方法で、別の方法を検討する必要があるわけですよね?
言い訳ばかりするのではなく、まず自分で手を動かしましょう。
いま案の方法でやりましたが 以前より 遅かったです。
ともあれ試すべきだ、という見解が多く寄せられ 皆さんのお時間をいただいてしまい申し訳ありません。
本来どういった発行分がベストなのかが わからないのが もどかしいです。
横着しないで、これを機に自分でSQLをチューニングする方法を学びましょう。
SQLServerのSQLチューニングの参考ページ
https://qiita.com/kazuho39/items/0d3e617661670311ea05
kainaさん 有用な情報をありがとうございます、勉強させて頂きます。
本件クローズとします。
ここまで具体的な数字の話なし。
------------------------------------------
「スピードが遅い」だけでは感覚だけでしかないので、実行計画や速度を数値ではかったうえで「何を目指すか」を決めて(ゴールのこと)やっていかないと、やろうと思えばどこまでもできてしまう(つまり「ベスト」などない)ものです。
許容範囲やラインを決めてください。
回答2件
あなたの回答
tips
プレビュー