4 Replies Latest reply: Feb 2, 2012 2:04 AM by user3466965 RSS

    データ型の異なる列での表結合について

    user3466965
      初めまして。
      質問させていただきます。

      下記の表結合でcolumnA1がNUMBER型でcolumnB1がVARCHAR2型の場合に
      結合時に暗黙の型変換が行われるのでしょうか?

      SELECT columnA2,columnB2 FROM tableA,tableB WHERE columnA1 = columnB1

      また、上記SQLをインデックスを用いて結合したいとしたら、columnA1とcolumnB1のデータ型を
      揃えるしか方法はないのでしょうか?

      ご回答宜しくお願いします。
        • 1. Re: データ型の異なる列での表結合について
          Takashi Matsuoka
          結合時に暗黙の型変換が行われるのでしょうか?
          はい、暗黙の型変換が行われるでしょう。
          また、上記SQLをインデックスを用いて結合したいとしたら、columnA1とcolumnB1のデータ型を
          揃えるしか方法はないのでしょうか?
          その必要は無いはずです。
          tableA、tableBの定義と、どちらが駆動表か教えていただけませんか?
          • 2. Re: データ型の異なる列での表結合について
            user3466965
            ご回答ありがとうございます。

            tableA (columnA1 NUMBER pk, ...) 20万レコード
            tableB (columnB1 VARCHAR2, columnB2, ...) columnB1,columnB2の複合主キー 6万5千レコード

            発行SQLは以下のようなものです。

            1.SELECT ... FROM tableA, tableB WHERE columnA1=columnB1 AND columnA1 = 11111
            2.SELECT ... FROM tableA, tableB WHERE columnA1=columnB1 AND columnB1 = '11111'

            上記SQLの実行計画を見ると
            1.は駆動表tableA
            tableA : Index Unique Scan
            tableB : Tabel Full Scan

            2.は駆動表tableB
            tableB : Index Range Scan
            tableA : Index Unique Scan

            となり、コストも2.の方が小さかったです。
            結合の際に、暗黙の型変換が行われるのとインデックスを使用することとは関連しているわけではない
            ということでしょうか?
            • 3. Re: データ型の異なる列での表結合について
              Takashi Matsuoka
              CBOトレース(10053)で確認したところ、FPD(filter push-down)で、
              FPD: Considering simple filter push in query block SEL$1 (#0)
              "TABLEA"."COLUMNA"=TO_NUMBER("TABLEB"."COLUMNB") AND "TABLEA"."COLUMNA"=11111
              try to generate transitive predicate from check constraints for query block SEL$1 (#0)
              finally: TO_NUMBER("TABLEB"."COLUMNB")=11111 AND "TABLEA"."COLUMNA"=11111
              と処理していました。

              下記のようにSQL文の変更で回避できます。
              select * from tablea,tableb where COLUMNA = COLUMNB and columna = 11111 and columnb='11111'
              select * from tablea,tableb where TO_CHAR(COLUMNA) = COLUMNB and columna = 11111
              • 4. Re: データ型の異なる列での表結合について
                user3466965
                ご回答ありがとうございます。

                SQL文の変更で暗黙の型変換を回避できることがわかり
                少し前進しました。

                恥ずかしながらCBOトレースは初めて知りました。
                FPDの見方(解釈の仕方)はマニュアルに載っているのでしょうか?