이번 포스팅은 정말 주관적인 생각입니다.
테이블의 총 건수를 알고싶은 경우 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(*) 쿼리는 거의 수행되지 않는 반면, 데이터 작업만 빈번하게 일어나는 서비스라면 괜한 비용낭비로 이어질 수 있습니다.
'Database > DBA 의 개인생각' 카테고리의 다른 글
[DBA] 트리거가 성능에 미치는 악영향에 대해서 (0) | 2019.08.07 |
---|---|
[DBA] 게시판 페이징 처리하는 방법 (Scan VS Seek) (0) | 2019.05.02 |
[DBA] DBA 란, DBA 가 하는일 알아보기 (0) | 2018.11.25 |
[DBA] 데이터타입 CHAR 와 VARCHAR 중 어느것을 써야할까? (1) | 2018.11.08 |
[DBA] WHERE 1 = 1 은 써야할까 말아야할까 (3) | 2018.09.18 |