안녕하세요,, 또 도움을 얻으러 왔습니다..
언제나 되야 도움을 드리는 입장이 될까요,,
빨리 그런 날이 오길,,
지금 데이터를 처리하는데 아이디가 100만개 왔습니다.
테이블은 id , date 두개가 있고 id 는 클러스터 date 는 넌클러스터 인덱스로 되어있습니다.
select * from table where id in (
'aid',
'bid'
.
.
.
) and (date < '2002-01-01' or date > '2015-06-06');
이렇게 했는데, 3만개가 넘어가면 에러를 내뱉거나 결과 값이 안나옵니다.
이 쿼리를 3만개가 되었을때 실행 계획은
Merge Join ( Right semi join ) 비용 : 30%
sort 비용 : 13%
clustered index scan : 57%
이렇게 나오는데요..
3만개 넘었을때는 쿼리가 복잡하니까 단순화 하라는 메세지가 나오거나
아니면 한참동안 기다려도 데이터가 안나오거나,,
아주 많은 양을 where in 으로 넣으면 메모리가 모자르다고 나오거나 합니다..
참고로 서버 메모리는 2기가,,
사실 백만개를 where in 에 아이디를 적었을때도
인덱스가 있기 때문에 금방 나올줄 알았거든요..
왜 이런 지연이 있는지 ㅜㅠ 고수님의 한마디 부탁 드립니다.
Comment 4
-
악마곰
2015.06.05 13:07
-
죄민수
2015.06.05 14:15
말씀하신 것처럼 이런 작업을 해보려고
테이블을 원래 본 테이블과 똑같이 하나 만들고
insert into temp_table select * from table where id in (
'aid',
'bid',
.
.
);
이렇게 in 안에 아이디를 오만개 쯤 넣어서 테스트 해보려는데 십분이 넘었는데도
완료가 안떨어져서 쿼리를 종료 했습니다.. ㅜㅠ
참고로 select top 100000 * from table 해서 십만개 조회는 1초만에 완료가 되었습니다.
-
향지
2015.06.05 15:27
mssql이 가지고 있는 메모리만 2기가 인가요
아니면 해당 서버 메모리가 2기가 인가요.
메모리가 모자라면 디스크에 썼다가 다시 메모리에 올렸다가 하는 작업을 할수도 있습니다.
갯수를 적게 해서 여러번 실행시키는 방법도 한번 체크해보세요.
중간 중간 결과 데이터는 테이블 하나 만들어서 넣으시구요.
-
죄민수
2015.06.05 17:05
서버 pc 자체 메모리가 2기가 입니다.
그런데 180만개의 id 리스트를 가지고 있는데 용량은 50메가 될까 말까 거든요..
남은 물리 메모리는 150mb 이구요. 기타 다른 정보들이 올라가서 그랬을까요.
일단 말씀하신대로 데이터를 잘라서 처리를 하긴 했습니다.
180만건을 3만건씩 잘라서 카피 복사 해서 수십번 수동 작업을,,, ㅜㅡ
궁금하긴 하네요, 정말 메모리 때문이었을까 하는,,
직접 테스트 해보지는 못했지만..
in 절에 들어갈 내용을 table에 넣어서
활용해 보시지요...
select * from table
where id in (select id from temp_table)
and date < '2002-01-01' and date '2015-06-06';