2008-11-13 2 views
11

현재 내 프로젝트에서 우리의 마스터 DB 스크립트를 발견했습니다. 자세히 살펴보면 모든 기본 기본 키의 데이터 유형은 입니다. 숫자 (38,0) 현재 주 데이터베이스 플랫폼으로 SQL Server 2005를 실행하고 있습니다.기본 키 열로 숫자 (38,0); 좋았어, 나쁜, 누가 신경 쓰냐?

약간의 문맥을 위해 Oracle과 SQL Server를 백 엔드로 지원합니다. Oracle에서 기본 키의 데이터 유형은 (38,0)입니다.

부작용과 성능에 미치는 영향을 알고 있습니까? 나는 항상 또는 bigint을 기본 키로 옹호하고 구현했으며 numeric (38,0)이 더 좋은 대안인지 알고 싶어합니다.

답변

12

글쎄, 입니다. 실제로 도달 할 수없는 번호를 저장하기 위해 더 많은 데이터를 보내고 있습니다.

BIGINT는 9,223,372,036854775807 바이트

8 INT는 4 바이트에서 2,147,483,647까지

숫자 간다에 (38,0)이 내가 수학 권리를하고있는 중이 야하는 경우, 17 바이트를 걸릴 것입니다까지 간다 .

큰 차이는 없지만 더 작은 데이터 유형 = 메모리에서 더 많은 행 (또는 동일한 행의 수보다 적은 페이지) = 조회를 수행하는 디스크 입출력 (색인 또는 데이터 페이지 탐색)이 적음. 복제, 로그 페이지 등에 대해서도 동일하게 적용됩니다.

SQL의 경우 INT는 IEEE 표준이므로 CPU가 비교하기 쉽기 때문에 INT 대 NUMERIC을 사용하여 성능이 약간 향상됩니다. 팩 10 진수 형식). (오라클에서 현재 버전이 내가 자란 이전 버전과 일치하는 경우 모든 데이터 유형이 압축되므로 INT 내부는 숫자 (x, 0)와 거의 동일하므로 성능 차이는 없습니다.)

따라서 디스크, RAM 및 여분의 I/O가 많은 경우 원하는 모든 데이터 유형을 사용하십시오. 조금 더 성능을 높이고 싶다면 좀 더 보수적으로하십시오.

그렇지 않으면이 시점에서 나는 그대로 두었습니다. 상황을 변경할 필요가 없습니다.

+0

하나의 작은 의견 : "더 작은 데이터 유형 = 메모리의 페이지가 더 많아야" "더 작은 데이터 유형 = 메모리의 더 많은 행 또는 레코드"를 읽어야합니다. 페이지는 저장하는 열 또는 인덱스의 크기에 관계없이 항상 8K입니다. – Rick

+0

릭 : 네. 다음과 같아야합니다 : 같은 수의 행에 대해 메모리에있는 페이지가 더 작습니다. 또는 말한 것처럼 - 더 많은 행. 좋은 캐치. 위키가되지 않고 편집 할 수 있다고 생각합니다. –

+0

호기심에서 INT가 IEEE 표준이라는 사실 때문에 CPU가 더 쉽게 비교할 수 있습니까? –

3

향후 고려해야 할 DBA의 스토리지 고려 사항 및 초기 혼란이 없으므로 NUMERIC (38,0)이 좋지 않은 이유는 없습니다. 테이블에 최대 9.99 x 10^38 레코드가 허용되므로 절대 도달하지 않을 것입니다. 이것으로 나의 빠른 파기는 그것을 사용하지 않는 어떤 현저한 이유도 나타나지 않았다. 나는 당신의 유일한 잠재적 인 문제가 그것에 의해 소비되는 저장 공간이 될 것이라고 의심하지만, 저장 공간이 너무 싸다는 것을 보았을 때, 그것은 문제가되어서는 안된다.

오라클 데이터베이스에서 꽤 많은 시간을 보았습니다. 테이블을 만들 때 생각할 필요가없는 꽤 큰 기본값입니다. INT 또는 BIGINT를 사용하는 것과 비슷합니다. SQL 서버.

2

이렇게 많은 행을 가지지 않기 때문에 너무 큽니다. 크기가 클수록 저장 공간이 늘어납니다. 이것은 그 자체로 큰 문제는 아니지만 더 많은 디스크 읽기가 테이블이나 인덱스에서 데이터를 검색하는 것을 의미합니다. 이는 데이터베이스 서 v의 메모리에 맞지 않는 행 수를 줄임을 의미합니다.

나는 고치기가 힘들다고 생각하지 않는다.

+0

"Never"는 위험한 단어입니다. StackOverflow의 웹 서버에서 모든 트래픽을 저장하기 위해 로깅 테이블을 작성한 경우 BigInt를 많은 문제없이 오버플로 할 수 있다고 생각합니다. – Rick

+0

그는 가장 중요한 문제 인 조인 비교 시간을 깜빡했습니다. int보다 숫자 (38)를 일치시키는 데 더 오래 걸립니다. 당신이 합쳐질 수있는 몇 개의 커다란 테이블에 합류한다면. –

+2

@Rick - SO가 하루에 1,000 만 건의 조회수를 얻었음에도 불구하고 BIGINT가 넘치기까지 25 억 년이 걸릴 것입니다. –

3

GUID를 사용하는 것이 좋습니다. 정말. 하나를 사용하지 않는 일반적인 이유는 정수가 더 잘 수행된다는 것입니다. 그러나 GUID는 numeric (38)보다 작으며 연결이 끊긴 사용자가 새 레코드를 만들고 동기화하는 것과 같은 일을하기가 쉽습니다.

+0

Joel, 답장을 보내 주셔서 감사합니다.하지만 FK에서 이러한 PK를 사용해야하므로 GUID는 우리의 목적을 위해 조금 더 성가신 일입니다. 이제는 내부 (int), 비즈니스 및 연결 해제 된 필요에 대한 GUID와 같은 3 가지 키가 있어야한다는 데 전적으로 동의합니다. – user37179

+1

FK의 GUID는 더 귀찮은가요? 어쨌든 그들을 보지 말아야하며 GUID가 numeric (38)보다 작기 때문에 데이터베이스가 조인 등을 더 빠르게 처리합니다. –