이번 포스팅은 정말 주관적인 생각입니다.


테이블의 총 건수를 알고싶은 경우 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(*) 쿼리는 거의 수행되지 않는 반면, 데이터 작업만 빈번하게 일어나는 서비스라면 괜한 비용낭비로 이어질 수 있습니다.

블로그 이미지

사용자 꽁담