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
운영게시판
최근게시물
MS-SQL Q&A 7243 게시물 읽기
No. 7243
서브쿼리 튜닝 문의
작성자
뉴비(hyunsik7548)
작성일
2021-12-06 15:45
조회수
117

SELECT 

 s.USN

,s.HERO_ID

,s.SKIN_ID

,(SELECT WEAPON_ID FROM dbo.USER_WEAPON as w where usn = s.USN AND WEAPON_SERIAL = s.WEAPON_SERIAL_1)

,(SELECT WEAPON_ID FROM dbo.USER_WEAPON as w where usn = s.USN AND WEAPON_SERIAL = s.WEAPON_SERIAL_2)

,(SELECT WEAPON_ID FROM dbo.USER_WEAPON as w where usn = s.USN AND WEAPON_SERIAL = s.WEAPON_SERIAL_3)

,(SELECT WEAPON_ID FROM dbo.USER_WEAPON as w where usn = s.USN AND WEAPON_SERIAL = s.WEAPON_SERIAL_4)

,(SELECT WEAPON_ID FROM dbo.USER_WEAPON as w where usn = s.USN AND WEAPON_SERIAL = s.WEAPON_SERIAL_5)

,(SELECT WEAPON_ID FROM dbo.USER_WEAPON as w where usn = s.USN AND WEAPON_SERIAL = s.WEAPON_SERIAL_6)

FROM dbo.USER_SKIN as s

WHERE USN = @IN_USN


이런쿼리가 있는데 실행계획을 보게되면 서브쿼리 때문에  USER_WEAPON 테이블에 액세스를 6번 하게 되어있는데요

USER_WEAPON 테이블에 액세스 1번만 하도록 튜닝가능할까요?

테이블구조는 변경할수없습니다

이 글에 대한 댓글이 총 1건 있습니다.
스칼라서브쿼리는 메이쿼리 결과 매행마다 수행됩니다.
즉 6번 엑세스가 아니라 (6 * 메인 결과 건수) 입니다.
서브쿼리가 아닌 조인방식으로 바꾸세요.

-- 1안) 6번 조인
SELECT s.usn
     , s.hero_id
     , s.skin_id
     , w1.weapon_id weapon_id_1
     , w2.weapon_id weapon_id_2
     , w3.weapon_id weapon_id_3
     , w4.weapon_id weapon_id_4
     , w5.weapon_id weapon_id_5
     , w6.weapon_id weapon_id_6
  FROM dbo.user_skin s
  LEFT OUTER JOIN dbo.user_weapon w1 ON w1.usn = s.usn AND w1.weapon_serial = s.weapon_serial_1
  LEFT OUTER JOIN dbo.user_weapon w2 ON w2.usn = s.usn AND w2.weapon_serial = s.weapon_serial_2
  LEFT OUTER JOIN dbo.user_weapon w3 ON w3.usn = s.usn AND w3.weapon_serial = s.weapon_serial_3
  LEFT OUTER JOIN dbo.user_weapon w4 ON w4.usn = s.usn AND w4.weapon_serial = s.weapon_serial_4
  LEFT OUTER JOIN dbo.user_weapon w5 ON w5.usn = s.usn AND w5.weapon_serial = s.weapon_serial_5
  LEFT OUTER JOIN dbo.user_weapon w6 ON w6.usn = s.usn AND w6.weapon_serial = s.weapon_serial_6
 WHERE s.usn = @IN_USN
;

1번만 사용도 가능하긴 합니다.
다만, 이 경우엔 결과건수가 늘어나므로 집계 과정이 필요합니다.

-- 2안) 1번 조인후 그룹핑 추가
SELECT s.usn
     , s.hero_id
     , s.skin_id
     , MIN(CASE w.weapon_serial WHEN s.weapon_serial_1 THEN w.weapon_id END) weapon_id_1
     , MIN(CASE w.weapon_serial WHEN s.weapon_serial_2 THEN w.weapon_id END) weapon_id_2
     , MIN(CASE w.weapon_serial WHEN s.weapon_serial_3 THEN w.weapon_id END) weapon_id_3
     , MIN(CASE w.weapon_serial WHEN s.weapon_serial_4 THEN w.weapon_id END) weapon_id_4
     , MIN(CASE w.weapon_serial WHEN s.weapon_serial_5 THEN w.weapon_id END) weapon_id_5
     , MIN(CASE w.weapon_serial WHEN s.weapon_serial_6 THEN w.weapon_id END) weapon_id_6
  FROM dbo.user_skin s
  LEFT OUTER JOIN dbo.user_weapon w
    ON w.usn = s.usn
   AND w.weapon_serial IN ( s.weapon_serial_1
                          , s.weapon_serial_2
                          , s.weapon_serial_3
                          , s.weapon_serial_4
                          , s.weapon_serial_5
                          , s.weapon_serial_6
                          )
 WHERE s.usn = @IN_USN
 GROUP BY s.usn, s.hero_id, s.skin_id
;

저는 1안) 추천합니다.
마농(manon94)님이 2021-12-06 16:57에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7246하나의 컬럼만 데이터가 다르고 다른 컬럼 데이터는 모두 동일한 레코드 합치기 [2]
김정모
2022-01-17
27
7244쿼리 질문드려요
유미
2022-01-12
31
7243서브쿼리 튜닝 문의 [1]
뉴비
2021-12-06
117
7240오라클  트리거 를 MSSQL 전환 문의 드립니다. [1]
김병훈
2021-10-01
195
7239중복되는 시간을 제거(포함) 하고 시작시간과 종료시간을 구하고 싶습니다. 쿼리 도움좀 부탁드려요. [1]
박인규
2021-08-27
292
7238쿼리문 보완좀 부탁드립니다. [2]
홍길동
2021-08-25
324
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2022 DSN, All rights reserved.
작업시간: 0.011초, 이곳 서비스는
	PostgreSQL v13.3으로 자료를 관리합니다