0

時間がかかりすぎるクエリがあります。10g oracle インスタンスを実行しています。TABLE_A には 30.000.000 行があります。TABLE_B には 300.000 行あります。

SELECT A.F1, A.F2, B.F1
  FROM (  SELECT A.F1, A.F2, B.F1
          FROM TABLE_A A LEFT JOIN TABLE_B B ON A.ID_B = B.ID_B
          WHERE A.F3 = ? AND A.F4 = ?
        ORDER BY B.F1)
 WHERE ROWNUM < 100

ビューを作成しようとしました:

CREATE VIEW TABLE_B_SORTED AS SELECT * FROM TABLE_B ORDER BY F1

そのようにクエリを変更する

SELECT A.F1, A.F2, B.F1
  FROM (  SELECT A.F1, A.F2, B.F1
          FROM TABLE_A A LEFT JOIN TABLE_B_SORTED B ON A.ID_B = B.ID_B
          WHERE A.F3 = ? AND A.F4 = ?
       )
 WHERE ROWNUM < 100

しかし、順序は管理されていません。

私もこの方法でクエリを変更しようとしました

SELECT A.F1, A.F2, T.F1
  FROM (  SELECT A.F1, A.F2, T.F1
          FROM TABLE_A A LEFT JOIN (SELECT * FROM TABLE_B B ORDER BY B.F1 ) T ON A.ID_B = T.ID_B
          WHERE A.F3 = ? AND A.F4 = ?
       )
 WHERE ROWNUM < 100

しかし、順序は管理されていません。

なにか提案を?

Plan
SELECT STATEMENT  ALL_ROWSCost: 8.943  Bytes: 2.871  Cardinality: 99                        
    7 COUNT STOPKEY                      
        6 VIEW MY_SCHEMA. Cost: 8.943  Bytes: 146.247  Cardinality: 5.043                  
            5 SORT ORDER BY STOPKEY  Cost: 8.943  Bytes: 226.935  Cardinality: 5.043              
                4 HASH JOIN OUTER  Cost: 8.881  Bytes: 226.935  Cardinality: 5.043          
                    2 TABLE ACCESS BY INDEX ROWID TABLE TABLE_A Cost: 8.117  Bytes: 172.725  Cardinality: 4.935      
                        1 INDEX RANGE SCAN INDEX I_TABLE_A Cost: 27  Cardinality: 10.166  
                    3 TABLE ACCESS FULL TABLE TABLE_B Cost: 758  Bytes: 2.791.520  Cardinality: 279.152
4

1 に答える 1

0

クエリに時間がかかりすぎる場合は、おそらく b.f1 に昇順のインデックスを作成する必要があります。

さらに、LEFT JOIN を実行している場合、これは B に NULL 値がある可能性があることを意味します。最初または最後にしますか?

おそらく、次のことを行う必要があります。

   SELECT /*+ first_rows_100 */ -- do not hesitate to use Oracle hints!
          a.f1, a.f2, b.f1
     FROM table_b b
    INNER JOIN table_a a
       ON a.id_b = b.id_b
    WHERE a.f3 = ? and a.f4 = ?
    ORDER BY b.f1 ASC

また、結合元の順序付けは完全に役に立ちません (2 番目と 3 番目のクエリ)。JOIN は、結果の行がソース テーブルで見つかった順序を維持することを保証するものではありません。

于 2011-09-01T09:12:50.393 に答える