OracleでテーブルをJOINした場合にORDER BYでインデックスが使われません。 まずは下記にOracleのLiveSQLで実験した結果を載せます。 --実験したSQL-- CREATE TABLE DOCUMENT ( DOCUMENT_ID CHAR(10), --PK NAME CHAR(30), OWNER VARCHAR(20), LOCATION CHAR(20), APPROVED CHAR(1), PRIMARY KEY(DOCUMENT_ID) ); CREATE INDEX DOC_INDEX ON DOCUMENT(APPROVED, NAME, OWNER, LOCATION); CREATE TABLE DOC_PAGE ( DOCUMENT_ID CHAR(10), --PK PAGE NUMBER,--PK CONTENT VARCHAR(1000), PRIMARY KEY(DOCUMENT_ID, PAGE) ); INSERT ALL INTO DOCUMENT VALUES (1, 'USER MANUAL', 'ALICE', 16, 1) INTO DOCUMENT VALUES (2, 'INSTRUCTION GUIDE', 'BOB', 29, 1) INTO DOCUMENT VALUES (3, 'ATTACHMENT' , 'JOHN', 39, 0) INTO DOCUMENT VALUES (4, 'HOGE' , 'NOAH', 46, 0) INTO DOCUMENT VALUES (5, 'FUGA' , 'PAUL', 99, 0) SELECT * FROM DUAL; INSERT ALL INTO DOC_PAGE VALUES (1, 1, 'XXXXXX') INTO DOC_PAGE VALUES (2, 1, 'XXXXXX') INTO DOC_PAGE VALUES (3, 1, 'XXXXXX') INTO DOC_PAGE VALUES (4, 1, 'XXXXXX') INTO DOC_PAGE VALUES (5, 1, 'XXXXXX') INTO DOC_PAGE VALUES (5, 2, 'XXXXXX') SELECT * FROM DUAL; --インデックスが使用されSORTのOPERATIONが発生しないSELECT EXPLAIN PLAN FOR SELECT * FROM DOCUMENT WHERE APPROVED='0' ORDER BY NAME, OWNER, LOCATION; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY()); --インデックスが使用されずSORT OPERATIONが発生してしまうSELECT EXPLAIN PLAN FOR SELECT * FROM DOCUMENT JOIN DOC_PAGE USING(DOCUMENT_ID) WHERE APPROVED='0' ORDER BY NAME, OWNER, LOCATION; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY()); --ここまで実験SQL 前者と後者のSQLのExplainの結果を画像で載せますが、 ご確認いただける通り、 前者はINDEX SCANにより最初からソートされたレコードを取得しているのに対し、 後者の方はテーブルアクセスした結果をソートしているため非効率なアクセスになっています。 JOINしてもSORT OPERATIONが発生しないようにする方法をご教示いただけないでしょうか。 サブクエリなどを使わずに実現したいです。よろしくお願いします。