ぽんこつSEサラリーマンの雑日記

SEの日常、おすすめアイテム、雑談等まったり書きます

【SQLチューニング】Postgreの不思議な現象2 (続き)

こんにちは
ぽんこつSEです。

前回、Postgreで外部結合にした場合に性能が改善されたけど、
何故か分からないという記事を書きました。

今回、少し分かったことがあるので、情報を記載しておきます。

Postgreのサイト「PostgreSQL 9.3.2文書」にて
www.postgresql.jp

こういったものがあり、読んでいました。

すると、以下の一文が目に止まりました。
「外部結合が含まれるような問い合わせでは、通常の(内部)結合よりプランナの選択の余地が小さくなります。」

そして、他にも以下の箇所にて
www.postgresql.jp

f:id:s-pnkt:20200418165841p:plain

結合する際の、内部構造的な話が記載していました。

ここで、基本的にはどの結合も内部結合が働くのか・・・と思い・・
「あれ、複数テーブルの結合の場合も、内部結合が先に動くのでは?」
とふと思いました。

よくよく考えれば、内部結合で全体の母数を削減してから外部結合で繋げる方が
対象のレコード数は減るので、当たり前のような気がするのですが、気付いていませんでした。

実際に、複数のテーブルの結合を用意し外部結合と内部結合を入れ替えて実行計画を確認すると
やはり内部結合が先に行われていました。

leading句や、ヒント句使えばいいじゃん。
となるかもしれませんが
DBのパラメータは変更できないような状況の現場でした。
(規模が大きすぎてあまり勝手なことは許されないし、管理している部署に申請や承認を得るのに資料を作って説明して・・・と大変です。)


そのため、出来る限りSQL内でなんとかしたいと思っていました。
(上記、使用する際にSQLだけでいけるのであればごめんなさい。)

なので、結合テーブルが複数あり、思った順番で動いてくれない場合
後で結合したいテーブルを外部結合にし、whereにてis not nullで対応するという方法もあります。

何か間違っていたり、馬鹿な事を書いていたらすみません。
もし参考になる方がいたら幸いです。