예를들어 ORDER 라는 테이블에
FLAG라는 컬럼의 값이 "Y"인 데이터가 100만건
FLAG라는 컬럼의 값이 "N"인 데이터가 1000만건
여기서 컬럼이 "Y"인 데이터를 카운팅할때 보통 select count(*) from ORDER where FLAG='Y' 이렇게 하는데
이걸 테이블을 분리해서
ORDER_Y 라는 테이블에는 FLAG='Y'인 데이터만 들어가도록 하고
ORDER_N 라는 테이블에는 FLAG='N'인 데이터만 들어가도록 해서
select count(*) from ORDER_Y 로 조회하는 방법이
select count(*) from ORDER where FALG='Y' 로 조회하는것과 비교할때
조회 속도의 차이가 있나요?
위 내용 관련해서 멀쩡하게 FLAG로 구분해서 where 조건문으로 멀쩡하게 불러와서 사용하고 있는데
갑자기 테이블을 아예 분리해달라는 요청이 왔거든요.
제가 알기론 두가지 경우에 속도 차이가 없는걸로 알고 있는데
제가 잘못알고 있던 건가요?
Comment 5
-
항해자™
2014.09.11 10:48
-
처리짱
2014.09.11 10:49
Y가 100만건 N이 1000만건이면 테이블에 데이터가
얼마나 있는지는 모르겠으나 풀스캔으로 사료됩니다..
BIT 컬럼에 인덱스 걸은것과 같은 효과가 아닐런지..
-
자리비움
2014.09.11 11:40
select count(*) from ORDER_Y 로 조회하는 방법이
select count(*) from ORDER where FALG='Y' 로 조회하는것과 비교할때
조회 속도의 차이가 있나요?
=>
ORDER_Y 는 100만건 스캔이고
ORDER where FLAG = 'Y" 는 1100만건 스캔입니다.
서버 성능에 따라서 차이가 미미할지는 모르겠지만
조회 속도의 차이가 있을듯 하네요.
count 가 빈번하다면
따로 count 만 저장하는 테이블을 만들고 해당 데이터가 insert 될때
count 테이블의 정보를 update 시켜주는 방법도 있습니다.
-
군고구마
2014.09.11 16:38
보통 그럴 count가 빈번 할 경우
저의 경우 counting 테이블을 따로 만들어서 insert 될 때 마다 숫자를 세줬습니다.
이게 더 좋다고 판단 됩니다. ~
count가 빈번하게 일어나는 것도 좋은 것은 아니니 ^^; 속도 전 둘 다 좋은 방법으로는 안보이네요.
물론 저의 생각입니다.
-
애즈원
2014.09.11 20:52
통계용 테이블도 고려해봤는데, 그냥 카운팅만 update 시켜주면 기간별 통계낼때
방법이 안보이더라구요.
어차피 스캔하므로 차이 없습니다,,
인덱스 하나 만들어 주시면 빠르겠네요,,
다만 flag 컬럼이 하나일 때는 인덱스를 하나만 만들면 되지만,,,
order_y, order_n 인 경우는 인덱스 두개 만들어야 하겠지요,,
아니면 복합으로 만들고 알맞게 검색하든지,,, 해야 겠지만,, 그닥,,,,