이번 포스팅은 정말 주관적인 생각입니다.
테이블의 총 건수를 알고싶은 경우 COUNT(*)를 사용하여야 합니다.
이는 DB입장에서 메타에 총 건수를 저장하여 COUNT(*)를 호출했을 때 해당 메타 정보를 반환하지 않는 한,
언제나 Full Scan을 해야한다는 상당히 고비용의 작업이 요구됩니다.
따라서 실시간 서비스를 하는 입장에서는 부담이 큽니다.
개인적으로 생각한 대안의 방법으로는 (이 방법이 좋은지 않좋은지는 알 수 없습니다. 상황에 따라 많이 다르기도 하고요.)
물리적으로 테이블 명과 해당 테이블의 레코드 수를 저장하는 테이블을 하나 더 만들어서 그곳에 데이터를 넣는 방법을 사용하면 어떤지 생각해 봅니다.
예시로 어떤 쿼리를 보겠습니다. (문법은 무시해 주시고 의미만 파악해주시길 부탁드립니다.)
INSERT가 성공하면, 테이블 레코드를 관리하는 테이블의 레코드 기록 컬럼을 + 1
DELETE가 성공하면, 테이블 레코드를 관리하는 테이블의 레코드 기록 컬럼을 - 1 을 하는 겁니다.
이렇게 하면 COUNT(*)를 사용하지 않고도 해당 테이블의 총 데이터 건수를 확인할 수 있겠죠.
INSERT INTO dbo.T1 VALUES (1, 1); COMMIT IF SUCCESS UPDATE dbo.Tab_rowCnt SET C2 = C2 + 1 WHERE C1 = 'dbo.T1' COMMIT DELETE FROM dbo.T1 WHERE C1 = 1 COMMIT IF SUCCESS UPDATE dbo.Tab_rowCnt SET C2 = C2 - 1 WHERE C1 = 'dbo.T1' COMMIT SELECT C2 FROM dbo.Tab_rowCnt WHERE C1 = 'dbo.T1' |
장점과 단점을 알아보겠습니다.
장점
1. 총 건수를 관리하는 테이블의 크기는 작기 때문에 증감 연산 수행 시 액세스로 인한 부하가 거의 없을 거라고 생각듭니다.
2. COUNT(*) 가 자주 수행되어야 하는 경우라면 Full Scan의 비용을 크게 줄일 수 있게 됩니다.
단점
1. 물론 INSERT, DELETE 작업의 쿼리마다 레코드수를 관리하는 테이블에 대한 쿼리를 한번 씩 더 작성해야 합니다. 이는 엄청난 관리 포인트 증가로 이어지게 될 수 있습니다.
2. COUNT(*) 쿼리는 거의 수행되지 않는 반면, 데이터 작업만 빈번하게 일어나는 서비스라면 괜한 비용낭비로 이어질 수 있습니다.
'Other' 카테고리의 다른 글
[개인생각] COUNT(*) 안쓰고 테이블 총 레코드 조회하는 법 생각해보기 (0) | 2019.02.12 |
---|---|
[리눅스마스터] 리눅스마스터 2급 2차 족보 공유 및 시험보는방법 알아보기 (51) | 2018.12.02 |
[개인생각] DBA 란, DBA 가 하는일 알아보기 (0) | 2018.11.25 |
[개인생각] 이번 AWS 장애를 생각하며 (0) | 2018.11.22 |
[개인생각] 블로그를 키우기 위해선 어떻게 해야할까? (4) | 2018.11.20 |
[개인생각] 데이터베이스 CHAR 와 VARCHAR 어느것을 써야할까? (0) | 2018.11.08 |