[질문] 오라클에서 COUNT()를 사용하는데 결과물 산출에 시간이 많이 걸립니다.
글쓴이: iadoy / 작성시간: 화, 2007/07/24 - 10:33오전
select count(column) from a_Table
위 ㅋ쿼리문을 실행시키면 1300MS가 걸립니다.
다른 MIN(), MAX()를 실행시키면 300MS 안에 결과물이 나오는데...
COUNT()만 이렇게 오래 걸리는건지요?
테이블의 데이터 건수는 이만건에서 구만건 사이인데.
시간이 많이 걸리네요...
column에는 인덱스가 설정되어 있고 PK이면서 NOT NULL입니다...
왜 이렇게 시간이 많이 걸리는 걸까요?
시간을 좀 단축할 수 있는 방법은 없을까요?
Forums:
일반적으로 select
일반적으로 select count(*) from a_table 이 보다 빠른것으로 알고 있습니다. 해당 칼럼이 PK이므로 둘은 같은 결과를 반환하기때문에 쿼리를 count(*)로 변경하여서 실행해 보시기 바랍니다.
select count(1) from table 이 더 빠른거 아닌가요?
select count(1) from table 이 더 빠른거 아닌가요?
모든 필드를 조사하지 않고 첫번째 필드만으로 작동한다고 들었던거 같은데.
건수 조회 할때는 count(1)을 사용하는게 나은걸로 알고 있는데요?
select count(1) as
select count(1) as table
하니까.. 그냥.. 1 이 나오네요..
select count(1)
도 1 이 나오고..
select count(1) from table
select count(1) from table 에서
1이 뜻하는 것은 첫번째 필드를 의미합니다.
Oracle의 경우 첫번째 필드는 프라이머리키이기 때문에 Not NULL이므로
대부분의 경우 원하는 건수를 셀수 있습니다.
만약 특정 필드를 Count에 지정할경우 NULL일 경우 건수에서 누락됩니다.
아닌데요...
1이 뜻하는 건 그냥 1입니다. select a, b, c, 1 from table 하면 모든 row에 대해서 a, b, c column의 값이 나오고 그 다음에 숫자 1이 나오겠죠.
select count(1) from XXX는 모든 row에 대해 "1"을 하나씩 배정하고 그 숫자를 세라는 건데 결국 row의 갯수를 세라는 말과 똑같습니다.
Oracle의 경우 primary key는 어떤 컬럼이든지 될 수 있습니다. 첫번째라는 제한은 없습니다.
Select Count(0) from table
Select Count(0) from table 해도 동일한 결과가 나오는군요...
count 함수에서 숫자는 컬럼 지정자 인줄 알았는데 잘못알고 있었네요.
primary key관련해서는 첫번째 컬럼를 primary로 사용하지 않고 중간 컬럼부터 primary key를 사용하는 경우를 본적이 없어서 "대부분"이라는 말을 넣을려다가 말았었는데 ..
근데 primary key를 중간 컬럼부터 사용하는 경우도 있나요?
oomi
ㄳ 위 댓글에 낚일뻔했네요
...
허접하게 글을 남겨봅니다.
min, max의 경우에는 해당 컬럼에 대해서 인덱스가 존재하거나 한다면 그 값을 찾는것은 빠를 수 있죠... (인덱스는 트리구조로 값을 기준으로 나눌테고 그러면 전체 스캔할 필요없이 인덱스중에서 큰것들만 타고 들어가면 되니까요)
count(col) 같은 경우 전체 행의 갯수가 얼마인지 알아야하고 table fullscan을 유발해서 그런게 아닐까요...
cbo을 이용하도록 하여 최대한 테이블/인덱스에 대한 통계를 dbms_stats등으로 유지를 하시면 조오금 더 빨라질수도 있을거 같은데요...
execution plan을 보시고 범위를 줄일 수 있다면 줄이시는게 좋지 않을까요?
단순히 한 테이블의 전체 행수를 구하는거라면 어렵겠지만 테이블의 어떤 범주에 속하는 행들이라면 이를 파티셔닝하거나 인덱스를 통해서 접근속도를 높이거나 전체접근이 아니라 범주로 나눠 접근할 수 있도록 할 수 있지 않을까요.
min/max의 경우에는 "INDEX FULL SCAN (MIN/MAX)"이라는 다른 접근방법을 사용하는것을 알 수 있습니다. 추가적으로 count(*) count(col)은 근소한 차이가 있겠지만 쿼리를 실행하고 데이터에 접근하는데는 같은 방식으로 접근하는것을 확인할 수 있습니다.
----
The future is here. It's just not widely distributed yet.
- William Gibson
댓글 달기