Comment 9
-
자리비움
2017.12.14 16:37
-
옳거니
2017.12.15 09:38
CustomerID 컬럼에 인덱스가 존재합니다.
select를 하게 되면 곧바로 데이터가 나오지만,
group by 나 distinct를 사용하여 중복을 제거해야되는데
하게 되면 시간이 오래 걸립니다...
선배님 혹시 다른팁이나 조언있으시다면 부탁드리겠습니다.
-
자리비움
2017.12.15 10:03
우선 몇 건인지 확인해보셔요.SELECT COUNT(*)FROM [Naver_201712]WHERE CustomerID = 123456그리고, 예제 쿼리가 아니라 실제 쿼리를 올려주시면조언을 드리는데 도움이 될 것 같습니다. -
옳거니
2017.12.15 10:41
네 실제 쿼리는
SELECT
[CampaignID]
FROM [Naver_Report_201712]
where CustomerID = 123456 AND
[CampaignID] is not null
group by CampaignID 입니다.
클러스터형 index로는 date (생성날짜)
비클러스터형 index customerID(사용자), campaignID(뽑아내고자하는 값 campaign의 index)가 있습니다.
일단 해당 CustomerID = 123456 만으로만 했을때, 1억1천만건 입니다... 하지만 최대 3개 테이블에서 3개월 치의 select 값을 가져와야 되지떄문에 3.5억만건정도 될것입니다
-
자리비움
2017.12.15 12:07
와우!
1억 1천만건을 GROUP BY 해야하는 업무는 처음 보네요.
우선 테이블의 전체 데이터가 얼마나 있는지는 모르겠지만 조회되는 데이터가 1.1억건이고,
CampaignID 인덱스가 결합(또는 include)이 아니라서 Lookup 이 발생할 것으로 보입니다.
이 때, Lookup 비용이 높으면 옵티마이저가 인덱스를 안타고 full scan 하기도 합니다.
(이건 실행 계획을 봐야 알 수 있고요.)
저라면, 우선 이렇게 합니다.
(참고로 저는 oltp 쟁이라 이런 대량 데이터 집계 형태의 쿼리는 안다뤄봤습니다)
1. GROUP BY 없이 WHERE CustomerID = 123456 에 조회된 데이터 기준으로 테이블을 만듭니다.
SELECT CampaignID INTO 새로운테이블명 Naver_Report_201712 WHERE 조건...
2. 새로 만든 테이블에 CampaignID 컬럼에 인덱스를 겁니다. 하나밖에 없으니 이걸로...
3. GROUP BY 합니다.
추가로,
4. CustomerID 값을 변경해서 조회해야 한다면, 새로운 테이블에 CustomerID, CampaignID 2개 컬럼을 복사하고
클러스터드로 CustomerID, CampaignID 결합으로 걸거나, CustomerID 에 CampaignID 를 include 로 설정합니다.
5. 해당 형태의 업무가 반복적이라면, 데이터가 insert 될때 Customer 별로 CampaignID 값을 다른 테이블에 저장합니다. 이때 이미 보유하고 있는 CampaignID 값이라면, 데이터를 남기지 않습니다.
그리고,
1. SELECT 만 있으면 빠르고 GROUP BY 가 있으면 느린 이유는 "부분범위처리"와 "전체범위처리" 를 공부해보시면 됩니다.
2. 주의해야 할 것들이 좀 있는데... 사수 계시면 물어보고 진행하세요.
-
옳거니
2017.12.15 15:46
선배님 답변 감사합니다.
현재 서브쿼리이나 조인으로 해결하려고 생각하고있었는데,
따로 테이블을 생성후 집계하라고 말씀해주셔서 갈피를 잡았습니다.
CustomerID가 너무 많아서 일일이 테이블을 만들기는 어려울것같았고,,
해당 customerID가 속해있는 그룹의 테이블을 월별로 따로 만들었습니다.
이렇게 하니 건수가 엄청나게 줄었고, campaign의 campaignID를 인덱스로 잡아서 9초~ 12초 이내로 조회가 가능하게되었습니다
많은 도움이 되었습니다 정말 감사합니다.
쿼리는
select distinct campaignID from Naver_속해있는그룹_Report_201712 where CustomerID = 123456 입니다.
근데 여기서 1초~2초로 나오게하는건 어렵겠죠..?
-
자리비움
2017.12.15 16:53
1초~2초내로 나오게 하는건 숙제입니다ㅋ
잘 해결하셨다니 다행이고요.
즐주말 보내세요.
-
이리
2017.12.15 10:06
가능 하시다면
실행 계획을 올려주시면 도움이 될 거 같습니다.
-
옳거니
2017.12.15 15:52
답변정말 감사합니다.
실행계획을 보려고 하니 SHOWPLAN 사용 권한이 거부되었습니다.
라고 나와서 못올릴것같습니다. 현재 사수님도 부재중이라ㅜㅜ 해결하려면 좀 걸릴것같습니다.
CustomerID 컬럼에 인덱스가 있어야 됩니다.
1억건이라고 하셨으니 인덱스 생성하는데 시간이 좀 걸릴듯 하고요.
생성이 완료된 후에는 대부분의 경우 1초 이내로 결과가 나올겁니다.