database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41969 게시물 읽기
No. 41969
OR EXPANSION 가능하도록 가능한지 확인 부탁드립니다.
작성자
김병두(kirio1)
작성일
2023-08-21 16:07
조회수
1,375

Oracle 19c 환경입니다.


테이블은 다음처럼 단순히 다음과 같습니다.

select * from obj where :b1='Y' or object_id=:B2;


조건에서 :B1='Y' 라는 조건에 OR 가 있어 OBJECT_ID 에는 Index 가 있음에도 Full Scan 을 수행합니다.

물론 SQL 에서 UNION 형태로 빼면 되겠으나 업무상 SQL 변경은 어렵습니다. hidden parameter 나 hint 로 or expansion 가능 할까요?

==

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 730912574


--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |  1295 |   608K|   412   (1)| 00:00:05 |

|*  1 |  TABLE ACCESS FULL| OBJ  |  1295 |   608K|   412   (1)| 00:00:05 |

--------------------------------------------------------------------------


Predicate Information (identified by operation id):

---------------------------------------------------


PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------


   1 - filter(:B1='Y' OR "OBJECT_ID"=TO_NUMBER(:B2))

이 글에 대한 댓글이 총 2건 있습니다.
-- 1. 조건을 바꿔 보기 --
SELECT *
  FROM obj
 WHERE (:b1  = 'Y')
    OR (:b1 != 'Y' AND object_id = :b2)
;

-- 2. 힌트 사용해 보기 --
SELECT /*+ USE_CONCAT */
       *
  FROM obj
 WHERE :b1  = 'Y'
    OR object_id = :b2
;

-- 3. 둘 다 적용해 보기 --
SELECT /*+ USE_CONCAT */
       *
  FROM obj
 WHERE (:b1  = 'Y')
    OR (:b1 != 'Y' AND object_id = :b2)
;
마농(manon94)님이 2023-08-22 10:10에 작성한 댓글입니다.

와 마뇽님 아직도 활동하시네요 반갑습니다^^


create table obj as select * from dba_objects;

create index idx_obj on obj (object_id);


select /*+ USE_CONCAT */ * from obj where :b1='Y' or object_id=:B2;

==> hint 안먹음


select * from obj where object_id = :b2

union

select * from obj where :b1='Y';

==> 위 처럼 query 변경 해야만 가능하나 업무 쿼리 변경 어려움


ㅠㅠ 감사합니다.

 

김병두(kirio1)님이 2023-08-31 08:34에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41974L [2]
고길당
2023-09-05
1850
41971row을 컬럼으로 변경하는 쿼리 좀 봐주세요, [3]
서주희
2023-09-01
1889
41970데이타베이스와 테이블이 안보이네요!!! [1]
신승익
2023-08-22
1288
41969OR EXPANSION 가능하도록 가능한지 확인 부탁드립니다. [2]
김병두
2023-08-21
1375
41968쿼리 좀 도와주세요. 도저히 못 구하겠어요 [3]
김진수
2023-08-11
1141
41967쿼리 질문드립니다! [1]
뽕구파파
2023-08-08
563
41966SqL 도움 요청입니다. [2]
김진수
2023-07-25
881
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다