정적데이터 쿼리 시 가장 빠른 방법이 무엇일까요? 0 13 2,174

by 열심열심 [2017.12.01 16:32:00]


60만건데이터를 select하는데 dcode, grouping, substr, group by rollup, having, orderby, sum이 다들어가서

약 8천건 정도 데이터를 가져옵니다. 매번 쿼리 수행하면 시간이 오래 걸려서

뷰로 해보니 속도 향상이 전혀 없네요 create table as select~ 하니 속도가 2배 향상되긴 했습니다. 

여기서 의문인게 60만건을 수많은 함수 거쳐서 뽑아내는거랑 그 결과값을 테이블로 저장해서 단순 select하는게  

생각보다 속도 차이가 크지 않네요.

정적인 데이터를 가장빨리 뽑는 방법이 무엇이 있을까요? 

 

 

by jkson [2017.12.01 17:22:53]

view는 미리정의한 sql일 뿐 물리적 실체가 없습니다.

--view 정의

create view v_sampleview

as

select 어쩌고저쩌고

--사용

select * from vsampleview -> vsampleview 부분이 위에 정의한 쿼리로 대체된다고 생각하시면 됩니다.

그래서 view를 만들었다고 해서 빨라질 수는 없는 거고요.

60만건을 grouping 하면 무슨 방법을 써도 느릴 수 밖에 없습니다.

그래서 아래 댓글에 집계 테이블을 만들고 월마다 집계하여 데이터를 미리 넣어두시라 한 겁니다.

예를들어

같은 월에 같은 이름으로 1000건 정도 쌓이는 경우

집계 테이블을 아래와 같이 만들고

create table 집계테이블

(

이름 varchar2(20),

년월 varchar2(6),

금액 number

)

11월 마지막 날에

insert into 집계테이블

(이름, 년월, 금액)

select 이름, '201711', sum(금액)

from 원테이블

where 날짜 between '20171101' and '20171130'

group by 이름

이런식으로 데이터를 넣어놓는다면

60만건을 읽을 필요 없이 소량의 데이터만 읽어도 원하시는 정보를 얻을 수 있겠죠.

12월이 끝나지 않은 상태에서 12월 현재까지의 총계를 보려면

select 이름, sum(금액)

from

(

select 이름, 금액

from 집계테이블

union all

select 이름, 금액

from 원테이블

where 날짜 between '20171201' and '20171231'

)

group by 이름

이렇게 하면 되겠죠.

월마다 이름 별로 건수가 적다면 아예 년도별로 관리하셔도 될 거구요.


by 열심열심 [2017.12.04 08:17:40]

create table T as select한 결과값한거랑

insert into T select 한거랑 차이가있나요? 

제가 이해가 안가는 부분은 60만건 쿼리 한결과나 create table as select해서 8천건 쿼리 결과나 

속도 차이가 별 차이가 없는 것이 좀 의아합니다. 

전자의 60만건은 수많은 함수와 그룹핑이 들어간 값이고 후자는 그 결과값을 테이블에 저장해서 select만 한 값인데

 


by jkson [2017.12.05 07:49:21]

제가 전혀 다른 쪽으로 포커스를 맞춰서 답변을 드렸네요.

밑에 적어주신 실행속도 보니 이상하긴 하네요.

다만 8000건을 화면에 전부 로드 하는 시간이라면

느릴 수는 있을 거 같아요.

단순히 8000건을 select count(1) 했을 때도 느린지 체크해보세요.


by 열심열심 [2017.12.05 13:07:26]

count1했을땐 바로 나옵니다. sqlplus내에서 속도 재면 화면뿌리는시간 제외하고 본인이 수행한 시간이 나오는데 그때도 mariadb보다 훨씬 느리긴합니다. 

 


by 우리집아찌 [2017.12.01 18:17:25]

MView로 만드셨나요?


by 열심열심 [2017.12.04 08:06:09]

mview는 EE에서만 지원하는 기능이라고 해서 못만들게되어있네요 SE라서


by 마농 [2017.12.04 08:47:31]

60만건 그룹핑 쿼리와 8천건 단순 쿼리가 별차이가 없다는게???
시간을 안적어줘서 감이 안오네요.
60만건 그룹핑 쿼리가 빠른 것일까요?
8천건 단순 쿼리가 느린 것일까요?
60만건 그룹핑 쿼리가 빠른 것이라면 그냥 쓰면 될 것 같구요.
8천건 단순 쿼리가 느린 것이라면 왜 느린지? 다른 이유가 있을 것 같네요.
60만건 그룹핑 쿼리가 느린 것은?
쿼리에 비효율은 없느지? 검토를 해봐야 할 사항입니다.


by 열심열심 [2017.12.04 10:38:07]

60만건을 가지고 그룹핑외에 수많은 함수 써서 8천건 값을 쿼리 나오는데 12~13초 정도 걸립니다. 

그래서 그 쿼리를 미리 create table xx as select~~해서 저장해놓을시에 8천건 검색하는데 5~6초 정도 소요됩니다.

이게 정상인 수준인가요? 


by 마농 [2017.12.04 10:46:43]

60만건 쿼리 12~13 초는 튜닝이 필요합니다.
8천건 5~6초는 비정상으로 보입니다.
5~6초가 순수 쿼리 수행시간일까요?
아니면 어플리케이션에서 8천건 전체를 화면에 뿌리는데 걸리는 시간일까요?
어플리케이션 시간이라면 그정도 걸릴지도 모르겠네요.


by 열심열심 [2017.12.04 11:34:11]

60만건은 위에 적힌 dcode, grouping, substr, group by rollup, having, orderby, sum을 사용하여 통계 정보를 가져옵니다.

그래서 10초 이상 걸리는건 어느정도 이해 되는데

그정보를 create table T as select~ 하여 저장 하여서 단순8천건만 불러오는데 그만큼 걸리는게 이상해서요. 

oracle sql develover를 통한 쿼리입니다. 


by 마농 [2017.12.04 11:36:37]

네. 비정상으로 보입니다.
그런데 다른 특이사항은 없나요?
컬럼이 엄청 많다던가? 컬럼중에 큰컬럼(LOB 형)이 존재한다던가?


by 열심열심 [2017.12.04 16:00:17]

추가로 mariadb나 여타 디비는 바로 이전 날린 쿼리에 대핸 버퍼에 저장되어서 바로 보여주는데 오라클은 현재 그런게 안보이네요. mysql처음에 0.8초걸린 쿼리 바로 연달아 날리면 0.0초 나오지만 오라클은 계속 2~3초 나오네요. 

db메모리자체는 오라클이 더 높은데...

 


by 열심열심 [2017.12.04 12:53:35]

컬럼은 19개이고 큰컬럼은 없습니다. number(10)이 대다수고..3개의nvarchar 또한 4또는 8이내 입니다. 

mariadb에 거의똑같은 환경 만들어서 돌리면 굉장히 빨리 쿼리 결과가 나오는데 

저도 이해가 안되네요. 결과값에 대한 테이블에 대한 select이면 엄청 빨라야 정상일 것 같은데..

 

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