[질문] 오라클에서 COUNT()를 사용하는데 결과물 산출에 시간이 많이 걸립니다.

iadoy의 이미지

select count(column) from a_Table

위 ㅋ쿼리문을 실행시키면 1300MS가 걸립니다.
다른 MIN(), MAX()를 실행시키면 300MS 안에 결과물이 나오는데...

COUNT()만 이렇게 오래 걸리는건지요?

테이블의 데이터 건수는 이만건에서 구만건 사이인데.
시간이 많이 걸리네요...

column에는 인덱스가 설정되어 있고 PK이면서 NOT NULL입니다...

왜 이렇게 시간이 많이 걸리는 걸까요?
시간을 좀 단축할 수 있는 방법은 없을까요?

익명 사용자의 이미지

일반적으로 select count(*) from a_table 이 보다 빠른것으로 알고 있습니다. 해당 칼럼이 PK이므로 둘은 같은 결과를 반환하기때문에 쿼리를 count(*)로 변경하여서 실행해 보시기 바랍니다.

nahanjang의 이미지

select count(1) from table 이 더 빠른거 아닌가요?
모든 필드를 조사하지 않고 첫번째 필드만으로 작동한다고 들었던거 같은데.
건수 조회 할때는 count(1)을 사용하는게 나은걸로 알고 있는데요?

익명 사용자의 이미지

select count(1) as table

하니까.. 그냥.. 1 이 나오네요..

select count(1)

도 1 이 나오고..

nahanjang의 이미지

select count(1) from table 에서
1이 뜻하는 것은 첫번째 필드를 의미합니다.
Oracle의 경우 첫번째 필드는 프라이머리키이기 때문에 Not NULL이므로
대부분의 경우 원하는 건수를 셀수 있습니다.
만약 특정 필드를 Count에 지정할경우 NULL일 경우 건수에서 누락됩니다.

jick의 이미지

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는 어떤 컬럼이든지 될 수 있습니다. 첫번째라는 제한은 없습니다.

nahanjang의 이미지

Select Count(0) from table 해도 동일한 결과가 나오는군요...
count 함수에서 숫자는 컬럼 지정자 인줄 알았는데 잘못알고 있었네요.

primary key관련해서는 첫번째 컬럼를 primary로 사용하지 않고 중간 컬럼부터 primary key를 사용하는 경우를 본적이 없어서 "대부분"이라는 말을 넣을려다가 말았었는데 ..
근데 primary key를 중간 컬럼부터 사용하는 경우도 있나요?

익명 사용자의 이미지

ㄳ 위 댓글에 낚일뻔했네요

ageldama의 이미지

허접하게 글을 남겨봅니다.

min, max의 경우에는 해당 컬럼에 대해서 인덱스가 존재하거나 한다면 그 값을 찾는것은 빠를 수 있죠... (인덱스는 트리구조로 값을 기준으로 나눌테고 그러면 전체 스캔할 필요없이 인덱스중에서 큰것들만 타고 들어가면 되니까요)

count(col) 같은 경우 전체 행의 갯수가 얼마인지 알아야하고 table fullscan을 유발해서 그런게 아닐까요...

cbo을 이용하도록 하여 최대한 테이블/인덱스에 대한 통계를 dbms_stats등으로 유지를 하시면 조오금 더 빨라질수도 있을거 같은데요...

execution plan을 보시고 범위를 줄일 수 있다면 줄이시는게 좋지 않을까요?

단순히 한 테이블의 전체 행수를 구하는거라면 어렵겠지만 테이블의 어떤 범주에 속하는 행들이라면 이를 파티셔닝하거나 인덱스를 통해서 접근속도를 높이거나 전체접근이 아니라 범주로 나눠 접근할 수 있도록 할 수 있지 않을까요.

> select max(col) from tbl;
 
...
Operation	Name	Rows	Bytes	Cost	PStart	PStop
SELECT STATEMENT		1 	4 	2 	  	  
  SORT AGGREGATE		1 	4 	 	  	  
    INDEX FULL SCAN (MIN/MAX)	PK_xxx	47K	184K	2 	  	  

> select count(col) from tbl
...
 
Operation	Name	Rows	Bytes	Cost	PStart	PStop
SELECT STATEMENT		1 	 	20 	  	  
  SORT AGGREGATE		1 	 	 	  	  
    INDEX FAST FULL SCAN	PK_xxx	47K	 	20 	  	  

> select count(*) from tbl
...
 
Operation	Name	Rows	Bytes	Cost	PStart	PStop
SELECT STATEMENT		1 	 	20 	  	  
  SORT AGGREGATE		1 	 	 	  	  
    INDEX FAST FULL SCAN	PK_xxx	47K	 	20 	  	  

min/max의 경우에는 "INDEX FULL SCAN (MIN/MAX)"이라는 다른 접근방법을 사용하는것을 알 수 있습니다. 추가적으로 count(*) count(col)은 근소한 차이가 있겠지만 쿼리를 실행하고 데이터에 접근하는데는 같은 방식으로 접근하는것을 확인할 수 있습니다.

----
The future is here. It's just not widely distributed yet.
- William Gibson

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.