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 41791 게시물 읽기
No. 41791
속도 개선 관련 문의 드립니다.
작성자
이상영(lsrara)
작성일
2020-04-06 15:37ⓒ
2020-04-06 15:38ⓜ
조회수
2,864

안녕하세요 초보 개발자 입니다.

데이터는 7000건 정도 인데 조회하면 속도가 너무 오래걸려서 어떻게 조절해야 할 지 몰라 문의 올립니다.

SELECT 

T1.AAA,

T1.BBB,

T1.CCC,

CASE

WHEN 

(

SELECT COUNT(ITEM_ID)

FROM FAQ_ITEM_T

WHERE ITEM_PARENT_ID=T1.ITEM_ID

)

> 0

THEN 'Y'

ELSE 'N'

AND AS HAS_CHILD

FROM FAQ_ITEM_T T1

WHERE BOARD_ID = 'TEST0001'

 

;

 

ITEM_ID 및 ITEM_PARENT_ID 에는 INDEX 가 지정되어 있습니다.

 

CASE 구문 때문에 쿼리가 느려지는 것으로 보이는데

어떻게 수정해야 할 지 막막해서요.

 

도움 부탁드립니다.

 

ㅠㅠ

 

이 글에 대한 댓글이 총 5건 있습니다.

서브쿼리에도 board_id 조건이 들어가야 하는 건 아닌지?
테이블의 인덱스가 어떻게 구성되어 있는지?
board_id 관련 인덱스는 있는지?
1. 스캔 범위 최소화
 - ROWNUM <= 1 조건을 추가해 보세요.
2. 테이블 랜덤 엑세스 제거
 - COUNT(item_id) 대신 COUNT(item_parent_id) 나 COUNT(*) 로 바꾸세요.

마농(manon94)님이 2020-04-06 16:25에 작성한 댓글입니다.
이 댓글은 2020-04-06 16:28에 마지막으로 수정되었습니다.

 

 

 

친절한 답변 감사합니다.

SELECT 

T1.AAA,

T1.BBB,

T1.CCC,

CASE

WHEN 

(

SELECT COUNT(*)

FROM FAQ_ITEM_T

WHERE 1=1

AND BOARD_ID = 'TEST0001'

AND ROWNUM <= 1

AND ITEM_PARENT_ID=T1.ITEM_ID

)

> 0

THEN 'Y'

ELSE 'N'

AND AS HAS_CHILD

FROM FAQ_ITEM_T T1

WHERE BOARD_ID = 'TEST0001'

 

AND 이 후에 검색 조건(날짜, 삭제여부 등)이 들어 오는 목록 쿼리 입니다. 

 

;

 

위와 같이 수정해 보았으나, 속도는 동일(느리게)하게 나오고 있습니다.

 

 

해당 테이블의 인덱스가 검색 조건에 따라 적용되게 끔 되어 있습니다.

 

IDX1 검색 조건이 날짜가 들어 오면 REG_DATE에 인덱스가 걸림.

IDX2 검색 조건이 댓글여부가 들어오면 ITEM_PARENT_ID에 인덱스가 걸림.

 

다만, 

ITEM_ID(PK) 및 ITEM_PARENT_ID 에는 INDEX 가 우선 지정되어 있습니다.

 

위의 내용만으로는 경우의 수가 너무 많을 것 같은데

어느 부분을 확인해 보면 좋을까요... ㅠㅠ

 

이상영(lsrara)님이 2020-04-06 18:44에 작성한 댓글입니다.

서브쿼리 개선해 드렸는데 전혀 효과가 없다면?
성능저하의 원인이 서브쿼리가 아닌 다른데 있는게 아닌지?
아니면 서브쿼리 인덱스를 제대로 이용하지 못하는 것은 아닌지?
7천건이면 적은 건수인데? 혹시 전체건수가 아닌 조회 건수인지?
페이징 처리는 하고 있는지?(서브쿼리를 페이징 처리 후로 미뤄 보세요.)
item_id 는 PK 인가요?
board_id 가 기본 조건인듯 한데? 이에 대한 인덱스는 있는지?
인덱스가 검색 조건에 따라 적용되게 끔 되어 있다는데? 어떻게 적용한 것인지?
어떤 조건이 어떻게 들어오는지? 조건은 가변적인지?
동적쿼리로 구성되나요?
바인드 변수가 사용되나요?

마농(manon94)님이 2020-04-06 21:05에 작성한 댓글입니다.
이 댓글은 2020-04-07 09:22에 마지막으로 수정되었습니다.

스칼라 서브쿼리인 case when 의 조회를 주석처리한 다음에도 느린가요? 

실행계획을 올려주시면 도움이 될겁니다. 

lucky님이 2020-04-07 12:15에 작성한 댓글입니다.
이 댓글은 2020-04-07 17:45에 마지막으로 수정되었습니다. Edit
안녕하세요. 
 
마농(manon94)님 그리고 lucky님 모두 감사합니다.
 
실행계획으로 확인해 보고,
아래와 같이 수정하여 속도 개선을 하였습니다.
 
 
SELECT 
T1.AAA,
T1.BBB,
T1.CCC,
/*
CASE
WHEN 
(
SELECT COUNT(*)
FROM FAQ_ITEM_T
WHERE 1=1
AND BOARD_ID = 'TEST0001'
AND ROWNUM <= 1
AND ITEM_PARENT_ID=T1.ITEM_ID
)
> 0
THEN 'Y'
ELSE 'N'
AND AS HAS_CHILD
*/
TX.HAS_CHILD AS HAS_CHILD 
 
FROM FAQ_ITEM_T T1
 
INNER JOIN
(
SELECT A.ITEM_ID, 'N' AS HAS_CHILD
FROM FAQ_ITEM_T A
WHERE BOARD_ID = 'TEST0001'
AND   NOT EXISTS
(SELECT 1
FROM FAQ_ITEM_T B
WHERE A.ITEM_ID=B.ITEM_PARENT_ID
AND B.BOARD_ID = 'TEST0001'
)
UNION ALL
 
SELECT A.ITEM_ID, 'Y' AS HAS_CHILD
FROM FAQ_ITEM_T A
WHERE BOARD_ID = 'TEST0001'
AND   EXISTS
(SELECT 1
FROM FAQ_ITEM_T B
WHERE A.ITEM_ID=B.ITEM_PARENT_ID
AND B.BOARD_ID = 'TEST0001'
)
)
TX
ON T1.ITEM_ID = TX.ITEM_ID
 
WHERE T1.BOARD_ID = 'TEST0001'
 
AND 이 후에 검색 조건(날짜, 삭제여부 등)이 들어 오는 목록 쿼리
;
 
인덱스는 따로 수정하지 않았고 그대로 두었으며, 
FROM 절 아래로 조건을 내려 보았습니다.
 
 
도움주셔서 너무 감사합니다.
 
이상영님이 2020-04-08 09:54에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
41794문자열 자르기 방법 [2]
블루이글
2020-04-29
4143
41793오라클 SE1 라이센스 기간 문의(만료일) [1]
카비
2020-04-20
2509
41792DBMS_SCHEDURE REPEAT_INTERVAL설정 [1]
박태학
2020-04-07
2796
41791속도 개선 관련 문의 드립니다. [5]
이상영
2020-04-06
2864
41789오라클완전초짜질문 [5]
조희정
2020-03-09
2643
41788조건절에 IN 절 과 조건을 아예 안쓰는 것. [5]
궁금이
2020-03-06
2622
41787Oracle 계층쿼리 관련 문의 드립니다. [2]
떡종이
2020-03-04
9499
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다