programing

SQL Server Int 또는 BigInt 데이터베이스 테이블 ID

goodsources 2023. 7. 20. 21:53
반응형

SQL Server Int 또는 BigInt 데이터베이스 테이블 ID

새 프로그램을 작성 중인데 데이터베이스(SQL Server 2008)가 필요합니다.시스템을 위해 현재 실행 중인 모든 것은 64비트이며, 이 질문을 하게 됩니다.다양한 테이블에 있는 모든 Id 열에 대해 모두 INT 또는 BIGINT로 만들어야 합니까? 시스템이 INT 범위를 초과할 수 있을지는 의문이지만 일부 더 큰 재무 테이블 내에서 가능합니다.INT가 표준인 것 같은데요...

자, 간단한 수학적 요약을 해보겠습니다.

  • INT는 32비트이며 기본적으로 40억 개의 값을 제공합니다. 0보다 큰 값만 계산해도 20억 개입니다.직원이 이렇게 많습니까?손님?재고가 있습니까?당신 회사의 일생 동안의 주문?정말?

  • BIGINT는 그것을 훨씬 뛰어넘습니다.그게 정말 필요합니까?정말요?만약 여러분이 천문학자이거나 입자 물리학에 관심이 있다면, 아마도.일반적인 LOB(Line of Business) 사용자?나는 그것을 강하게 의심합니다.

예를 들어 1,000만 줄(회사 주문)의 테이블이 있다고 상상해 보십시오.예를 들어, 주문 테이블이 있고 그 주문은BIGINT를 만든 ID는 5개의 다른 테이블에서 참조되며 주문 테이블의 비클러스터형 인덱스 5개에 사용됩니다. 너무 많이 사용된 것은 아니죠?

1,000만 행에 5개의 테이블과 5개의 비슬래시 인덱스를 더하면 4바이트 - 4억 바이트 = 400MB가 아닌 8바이트를 각각 사용하는 1억 개의 인스턴스를 의미합니다. 총 낭비...데이터 및 인덱스 페이지가 더 필요하고, SQL 서버는 디스크에서 더 많은 페이지를 읽고 더 많은 페이지를 캐시해야 합니다.단순하고 단순하게 성능에 도움이 되지 않습니다.

플러스: 대부분의 프로그래머들이 생각하지 않는 것: 네, 디스크 공간은 매우 저렴합니다.그러나 낭비되는 공간은 SQL Server RAM 메모리와 데이터베이스 캐시에도 관련이 있으며, 이 공간은 매우 저렴합니다.

아주 긴 글을 짧게 요약하자면, 여러분의 요구에 맞는 가장 작은 유형의 INT를 사용하세요; 만약 여러분이 처리해야 할 10-20개의 다른 값이 있다면 - TINYINT를 사용하세요.만약 당신이 주문표가 필요하다면, 나는 INT가 충분해야 한다고 생각합니다. BIGINT는 단지 공간 낭비일 뿐입니다.

또한 테이블이 실제로 20억 또는 40억 행에 가까워질 경우 테이블을 BIGINT ID로 업그레이드할 시간이 충분합니다. 필요하다면...

여기 성과에 대한 실제 답변이 포함된 기사가 있습니다.가능하면 어려운 숫자로 질문에 대답하는 것을 선호합니다.다음 링크를 클릭하면 100만 개 이상의 레코드가 생성됩니다. 디스크 사용량에서 무시할 수 있는 차이가 발생합니다.

http://www.sqlservercentral.com/articles/Performance+Tuning/2753/

개인적으로 저는 적절한 ID 크기를 사용하는 것이 중요하다고 생각하지만, 시간이 지남에 따라 많은 활동이 있는 테이블이 있을 수 있다는 사실도 고려합니다.방대한 양의 데이터를 저장하는 것이 아니라 자동으로 증분되는 특성(시간이 지남에 따라 삭제 및 삽입이 발생함)으로 인해 키 값이 증가한 것입니다.

커뮤니티 사이트의 파일 리포지토리 또는 커뮤니티 사이트 멀티 테넌트 응용 프로그램의 사용자 설명 ID를 고려합니다.

대부분의 개발자가 수백만 개의 레코드를 절대 건드리지 않을 시스템을 구축하고 있다는 것은 이해하지만, 중요한 것은 빅틴트가 필요한 이유가 있다는 것입니다.그리고 저는 여전히 당신이 스키마를 설계할 때 잠재적인 성장을 모르는 경우 미래를 예측하려고 시도하지 말고 id 값이 증가함에 따라 잠재력이 int의 최대값을 초과한다고 느낀다면 bigint를 사용하는 것을 고려해야 한다고 확신하지 않습니다.

해당 테이블에 적합한 가장 작은 데이터 유형을 사용해야 합니다.여기에는 사용도 포함됩니다.smallint아니 심지어는tinyint행 수가 적은 경우

데이터와 인덱스 모두에서 공간을 절약하고 인덱스 성능을 향상시킬 수 있습니다. 사용bigint당신이 필요한 것이 단지smallint를 사용하는 것과 유사합니다.varchar(4000)당신이 필요한 것이 단지varchar(50).

컴퓨터의 기본 워드 크기가 64비트라고 해도 64비트 CPU 작업이 32비트 작업보다 느리지 않음을 의미합니다.대부분의 경우 속도가 더 빠르지 않고 똑같을 것입니다.그러나 대부분의 데이터베이스는 CPU에 바인딩되지 않고 I/O에 바인딩되며 메모리에 바인딩되지 않으므로 데이터 크기가 50%~90% 더 작은 것이 2억 행에 걸쳐 인덱스 검색을 수행해야 할 때 매우 유용합니다.

32비트 숫자를 x86 아키텍처와 정렬하거나 64비트를 x64 아키텍처와 정렬하는 것을 데이터 구조 정렬이라고 합니다.

성능에 영향을 미치는 것은 디스크 공간, 데이터 캐시 및 테이블/인덱스 아키텍처이기 때문에 데이터베이스의 데이터에는 아무런 의미가 없습니다(다른 답변에서 언급한 바와 같이).

데이터에 액세스하는 것은 CPU가 아닙니다.CPU에서 실행되고 데이터를 조작하는 것은 DB 엔진 코드입니다.데이터가 CPU를 통과할 때 또는 데이터가 동일한 디스크 구조에 있지 않을 것입니다.

다른 사람들은 이미 32비트 ID에 대해 설득력 있는 답변을 했습니다.

일부 애플리케이션의 경우 64비트 ID가 더 적합합니다.

데이터베이스 클러스터 전체에서 ID가 고유하도록 하려면 ID에 대한 63비트가 매우 편리합니다.32비트의 경우 클러스터의 서버 또는 데이터 센터에 ID 생성을 분산하기가 매우 어렵습니다.64비트를 사용하면 잠금 없이 여러 서버에서 편리하게 ID를 생성할 수 있으며 고유성을 보장할 수 있습니다.

예를 들어 Twitter Snowflake와 Instagram Engineering의 "Instagram에서의 샤딩 & ID" 블로그 게시물참조하십시오.두 가지 모두 63비트 또는 64비트가 32비트 카운터보다 ID에 더 적합한 이유를 제공합니다.

첫 번째 대답은 TB 크기의 데이터베이스나 일정하고 볼륨이 큰 삽입이 있는 테이블을 사용하지 않는 사용자에 대한 순진한 대답입니다.적절한 크기의 데이터베이스에서 INT의 수명 중 어느 단계에서 문제가 발생할 것입니다.BIGINT를 사용하면 나중에 많은 번거로움을 줄일 수 있기 때문에 따라 BIGINT를 사용하십시오.저는 기업들이 불과 1년의 데이터 이후 INT 문제를 겪고 있는 것을 보아 왔습니다. 재시딩이 옵션이 아닌 곳에서는 대규모 다운타임이 발생했습니다.또한 시스템이 여전히 사용될 것으로 예상되지 않았던 장기 실행 시스템(10년 이상)에서는 오래된 데이터를 삭제하는 중간 크기의 데이터베이스에서도 문제가 발생했습니다.대량의 데이터가 예상되지만 필요한 경우 BIGINT를 사용하지 않는 경우 대부분의 경우 GUID를 사용하는 것이 훨씬 좋습니다.

어떤 데이터 유형이 각 테이블의 요구 사항을 충족하는지에 대해 각 테이블을 개별적으로 판단해야 합니다.INTEGER가 특정 테이블의 요구 사항을 충족하는 경우 해당 항목을 사용합니다.SMALLINT로 충분하다면, 그것을 사용하세요.과도하지 않고 지속될 데이터 유형을 사용합니다.

언급URL : https://stackoverflow.com/questions/2124631/sql-server-int-or-bigint-database-table-ids

반응형