時間がかかりすぎるクエリがあります。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