0

非常に長い時間(15〜30秒)かかる(クエリ1)(オラクルで)このクエリがあります

SELECT numcen
  FROM centros
 WHERE TO_NUMBER (centros.numcen) = TO_NUMBER (?)
    OR TO_NUMBER (centros.numcen) IN (
          SELECT TO_NUMBER (dc.centro)
            FROM datos_centro dc, centros c
           WHERE TO_NUMBER (c.numcen) = TO_NUMBER (dc.centro)
             AND TO_NUMBER (dc.centro_superior) = TO_NUMBER (?));

非常に単純なクエリなので、理由はわかりません。内部のサブクエリが原因だと思っていましたがIN、そのようなサブクエリ(query2)を実行すると:

SELECT TO_NUMBER (dc.centro)
  FROM datos_centro dc, centros c
 WHERE TO_NUMBER (c.numcen) = TO_NUMBER (dc.centro)
   AND TO_NUMBER (dc.centro_superior) = TO_NUMBER (?)

100 ~ 200ms しかかかりません。さらに、query2を実行し、その結果をquery1INの中に入れてサブクエリを置き換えると、結果はすぐに得られます。

権限がないため、Explain Plan を実行できません。mysql で実行するとさらに悪化します ( に置き換えTO_NUMBERますCAST)。2分以上かかりますが、これは容認できません。

では、最初のクエリ ( query1 ) を改善する方法はありますか? 二つに分けるべきですか?(はるかに高速です)で置き換えORた場合、同じクエリになりますか?UNION

どんなアドバイスでも大歓迎です。私の英語に感謝し、申し訳ありません。

4

3 に答える 3

0

グローバル一時テーブルの概念を使用して、一時テーブルにサブqryの結果セットを挿入してから、一時テーブルからselect *を使用するか、メインqryと直接結合してください。

この問題があったとしても、これによりパフォーマンスが何倍にも向上すると確信しています。

試してみて、何か問題があれば教えてください。

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
  column1  NUMBER) ON COMMIT PRESERVE ROWS;

insert into my_temp_table 

  SELECT TO_NUMBER (dc.centro)
  FROM datos_centro dc, centros c
 WHERE TO_NUMBER (c.numcen) = TO_NUMBER (dc.centro)
   AND TO_NUMBER (dc.centro_superior) = TO_NUMBER (?)
于 2013-05-23T10:05:42.117 に答える
0

サブクエリで centros を参照するのは冗長です。

試す:

SELECT numcen
  FROM centros
 WHERE TO_NUMBER (centros.numcen) = TO_NUMBER (?)
    OR TO_NUMBER (centros.numcen) IN (
          SELECT TO_NUMBER (dc.centro)
            FROM datos_centro dc
             AND TO_NUMBER (dc.centro_superior) = TO_NUMBER (?));

... また ...

SELECT numcen
  FROM centros
 WHERE TO_NUMBER (centros.numcen) IN (
          SELECT TO_NUMBER (?)
            FROM dual
          UNION ALL
          SELECT TO_NUMBER (dc.centro)
            FROM datos_centro dc
             AND TO_NUMBER (dc.centro_superior) = TO_NUMBER (?));

これらの TO_NUMBER() 関数が必要ない場合は、それらを取り除くか、TO_NUMBER(centros.numcen) と TO_NUMBER (dc.centro_superior) に関数ベースのインデックスを追加します。

于 2013-05-23T12:53:52.280 に答える