쿼리 조회시 속도 느림 0 6 1,161

by 뭐필요해 [Oracle 기초] 오라클 [2019.01.18 16:25:24]


시스템에서 조회시 아래 쿼리가 실행되고 결과값이 나오기까지 85초 정도 걸립니다.

테스트해보니 ORDER BY A.LT DESC 이 부분을 빼면 25초 정도 걸리고
(EQ = A.LT OR IC.CH = A.LT) 이부분도 빼면 1초 정도 걸리고,
SELECT COUNT(*) ~ ) AS WRKCHK 까지 빼면 조회시간이 1초 정도 걸립니다.

(SELECT COUNT(*)......) 때문에 오래걸리는 것 같습니다.

전체 데이터는 10,000건이고, 검색 결과는 140건 정도 됩니다.


INDEX_DESC를 넣으면 검색 속도가 빨라진다고 하여 넣어봤지만 잘 못 넣어서 그런지 속도가 똑 같고, 어떻게 해야 속도가 빨라지는지 모르겠습니다.
도와주십시오.


TABLE_NAME: LIG
INDEX_NAME: LIG_PK
---------------------------------------

SELECT 
      A.LT, 
      A.EU,
      GET_CODENAME('C101', A.ST) AS STN,
      A.MN,
      A.MNF,
      B.LTC,
          (
          SELECT 
          COUNT(*)
          FROM
          MOR IA,
          MNT IB,
          MMN IC
          WHERE IA.ORD = IB.ORD AND
                IB.WRK = IC.WRK AND
                        IA.WRK = '10' AND
                        (EQ = A.LT OR IC.CH = A.LT)
          ) AS WRKCHK
FROM
      LIG A,
      EQU B
WHERE
      A.EU = B.EU
      AND A.MNG = '12'
      AND B.EQ = '10'
      AND A.USE = '11'
      AND A.MNGG = '10'

        ORDER BY A.LT DESC;
by 마농 [2019.01.21 09:23:54]

스칼라 서브쿼리가 문제네요.
스칼라 서브쿼리는 아우터 조인으로 바꿀 수 있습니다.
그런데 문제는 OR 조건이네요?
OR 조건에 나온 EQ 는 어떤 테이블의 컬럼인가요?
각 테이블의 PK 정보와 테이블간의 관계를 알아야 조인으로 변경 가능 할 듯 하네요.


by 뭐필요해 [2019.01.21 11:18:47]

테이블과 PK정보입니다.

 

EQ = EQU테이블의 컬럼입니다.

감사합니다.

테이블= LIG EQU MOR MNT MMN
PK= LT EU ORD WRK CHK
  EU USE MNG ORD WRK
  MN EQ     EQ
  MNF       CH
  ST        
  MNGG        
  USE        

by 마농 [2019.01.21 11:35:17]

OR 조건의 EQ 는 MMN IC 의 컬럼인 것으로 보입니다.
조인 조건을 보면 PK 로 조인하는 게 하나도 없네요?
전부 다 PK 의 일부만 가지고 조인을 하네요?
이게 여러 테이블을 이런식으로 조인하면, 자료가 엄청나게 중복되어 조회될 텐데요?
쿼리 속도가 문제인 것 맞나요?
자료가 정확하게 나오지 않을 듯 한데요?


by 뭐필요해 [2019.01.21 11:50:43]

네. EQ는 EQU와 MMN 테이블의 컬럼입니다.

EQU의 EQ는 값이 다 들어있고, MMN의 EQ는 값이 없을 수도 있습니다.

쿼리 속도가 늦은게 문제입니다.(85초)

 

자료는 저 상태로 하면 정확하게 나오구요.

검색된 자료 140건 중 WRKCHK에 "1"이 나와서 = 원하는 값은 "1" 입니다.


by 마농 [2019.01.22 13:15:26]

글쎄요?
A, B 조인 조건을 보면 a.use = b.use 조건이 누락된 듯 하고
IA, IB 에서는 ia.wrk = ib.wrk 가 누락된 듯 하고
조건이 많이 이상한데요?
 


by 마농 [2019.01.22 13:48:02]

카운트는 항상 1 또는 0 만 가능한가요?
1개 이상 나올일이 없다는 게 보장된다면?
그렇다면 스칼라 서브쿼리를 아우터 조인으로 변경하면 좋을 듯 하네요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입