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

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

【SQLチューニング】Postgreの不思議な現象

こんにちは

ぽんこつSEです。

今回は現場で起きた不思議な出来事と解決策を書きます。

今の現場ではPostgre9.3.3を使用しています。

多重結合しているSQLがあり、性能問題が発生していたため、チューニングすることになりました。
実際のソースとは異なり、実行計画も現場にあるため持って変えることは出来ないのでおおまかな記載となってしまうのですが
以下のようなSQLです。

select *
from
  (
  select *
  from A
  where 1=1
  AND  A.xxx = 'abc'
  AND A.yyy = 'aaa'
  )A1
 INNER JOIN B
ON   A1.a = B.a
AND A1.b = B.b
 INNER JOIN C
ON   A1.c = C.c
AND A1.d = C.d
AND B1.d = C.d(ここはBの結合結果の値を使用)
INNER JOIN D
・
・
・

ほとんどのテーブルは主キーで結合していますが

実行計画を見てみると、結合キーの一部のみで繋がっている?ように見えます。
rowsが100万件程になっています。(サブクエリのwhere適用後は数100件程度)
上の例だと、A1.b = B.bのような結合(a項目の結合が無い?)です。

結局理由は分かりませんでしたが、
結合しているテーブルを一部、外部結合にすると治りました。

select *
from
  (
  select *
  from A
  where 1=1
  AND  A.xxx = 'abc'
  AND A.yyy = 'aaa'
  )A1
LEFT JOIN B
ON   A1.a = B.a
AND A1.b = B.b
LEFT JOIN C
ON   A1.c = C.c
AND A1.d = C.d
AND B1.d = C.d(ここはBの結合結果の値を使用)
INNER JOIN D
・
・
WHERE
B.xxx is not null
C.xxx is not null

変更後、再度実行計画を見るとrows等も適切な件数になってそうでした。
一体何なのでしょうか・・・。
もし誰かピンと来る方がいらっしゃれば教えて下さい・・。

自宅にDB環境構築しようかなぁ・・。

SQLアンチパターン

SQLアンチパターン

  • 作者:Bill Karwin
  • 発売日: 2013/01/26
  • メディア: 大型本