InterBase(2009년 이전)의 최대 테이블 크기
Dmitry Kuzmenko, 2009년 10월 20일
저희 고객 중 한 분과의 흥미로운 기술 지원 incident를 처리하던 중, 실제 최대 행 수가 명시된 제한과 다르다는 사실을 발견했습니다.
문서 세트 [InterBase 6 운영 가이드, 27페이지, InterBase 사양]에는 다음과 같이 명시되어 있습니다:
“테이블당 최대 행 및 열 수: 설계상 2^32행입니다. 행은 테이블당 32비트 부호 없는 정수로 열거되기 때문입니다.”
물론 행은 32비트 정수로 열거됩니다. 안타깝게도 실제로 어떤 테이블도 20억 레코드 제한에 도달할 수 없습니다. 단 하나의 열만 있는 테이블조차도 말이죠.
이러한 동작의 이유는 새(삽입된) 레코드를 위한 여유 공간 계산 알고리즘에 있습니다. 정수 오버플로우가 발생할 수 있으며, interbase.log에 다음과 같은 오류 메시지가 표시됩니다:
pointer page vanished from DPM_next (249)
그리고 실제로 데이터베이스 페이지 크기나 행 크기는 이 제한에 영향을 미치지 않습니다. 이 제한은 항상 동일한 마법의 테이블 크기(약 36.6기가바이트)이며, 모든 데이터베이스 페이지 크기에 대해 페이지 수로 계산할 수 있습니다:
한 테이블의 최대 페이지 수는 다음과 같이 계산할 수 있습니다:
MaxDataPageCount = (MaxInt / PageSize) * 17.476
물론 MaxInt = 2147483647입니다. PageSize 자리에 데이터베이스 페이지 크기를 넣으면 결과는 어떤 테이블에 할당될 수 있는 페이지 수를 보여줍니다.
예를 들어, 4K 페이지 크기의 데이터베이스에서 테이블은 약 900만 개 이상의 데이터 페이지를 가질 수 없습니다.
레코드 수 관점에서 보면, 정수 열 2개를 가진 테이블은 6억(!) 레코드 이상으로 커질 수 없습니다(모든 레코드에 14바이트 헤더가 있다는 것을 잊지 마세요).
혼란스러우신가요? MaxDataPageCount에 PageSize를 곱하고, 그 결과를 가장 큰 테이블의 평균 레코드 크기로 나누면 해당 테이블이 제한을 초과하여 데이터베이스가 작동을 중지할 시점을 알 수 있습니다.
이 제한은 Firebird 2에서만 수정되었습니다. InterBase 2007에는 여전히 존재합니다.
이 페이지의 정보에 대해 질문이나 제안이 있으시면 [email protected]으로 저희 연구팀에 연락해 주시기 바랍니다. 또한 InterBase 또는 Firebird와 관련된 흥미롭거나 이상한 사항에 대한 정보도 환영합니다.