문제

지금까지 나는 c# "guid = guid.newguid ();" 방법 LINQ에서 SQL을 사용하여 일부 SQL Server 데이터베이스 테이블에서 ID 필드로 저장할 수있는 고유 ID를 생성하는 방법. 인덱싱 이유 때문에 안내서를 사용하는 것은 나쁜 생각이며 대신 자동 증가를 사용해야한다는 정보를 얻었습니다. 긴 속도를 사용하면 데이터베이스 트랜잭션이 있습니까? 그렇다면 유형이 길어진 고유 한 ID를 생성하는 방법은 무엇입니까?

문안 인사,

도움이 되었습니까?

해결책

두 가지 모두 장단점을 가지고 있으며, 그것은 당신이 중요한 것을 사용하는 방법에 전적으로 달려 있습니다.

BAT 바로에서, 여러 데이터베이스에서 작동 할 수있는 식별자가 필요한 경우 안내가 필요합니다. 긴 트릭이 있습니다 (각 데이터베이스를 다른 종자/증분으로 수동으로 할당). 이들은 확장되지 않습니다.

인덱싱이 진행되는 한, 인덱스가 클러스터되면 (기본적으로 기본 키가 클러스터링되지만 테이블에 대해 수정 될 수 있음) 인덱스가 훨씬 더 나은 삽입 성능을 제공합니다. 테이블은 모든 삽입 후에 개편 할 필요가 없기 때문입니다.

그러나 동시 인서트에 관한 한, 긴 (Identity) 열이 느려질 때 Guid- Identity Column 생성에는 일련의 독점 잠금이 필요합니다. 많은 사용자가 항상 많은 행을 삽입하는 환경에서는 성능이 적용될 수 있습니다. 이 상황에서 Guid Generation이 더 빠릅니다.

저장 현명한, Guid는 긴 공간의 두 배를 차지합니다 (8 바이트 vs 16). 그러나 8 바이트가 한 잎에 맞는 레코드 수에 눈에 띄는 차이를 만들고 평균 요청 중에 디스크에서 가져온 잎 수에 눈에 띄는 차이를 만들면 행의 전체 크기에 따라 달라집니다.

다른 팁

긴 (SQL Server의 큰 int)는 8 바이트이고 안내서는 16 바이트이므로 조회 할 때 SQL Server의 수를 절반으로 줄입니다.

길이를 생성하려면 데이터베이스에서 필드를 생성 할 때 사용 ID (1,1)를 사용하십시오.

따라서 작성 테이블 또는 Alter Table을 사용하여 :

Field_NAME BIGINT NOT NULL PRIMARY KEY IDENTITY(1,1)

LINQ에 SQL을 게시하는 의견을 참조하십시오

"인덱싱의 여왕" - 김 트립 - 기본적으로 인덱싱 블로그 게시물에 모든 것을 말합니다.

기본적으로 모범 사례는 다음과 같습니다. 최적의 클러스터링 키는 다음과 같습니다.

  • 독특한
  • 작은
  • 안정 (절대로 변하지 않음)
  • 점점 증가합니다

Guid는 "작은"및 "계속 증가하는"것을 위반하므로 최적이 아닙니다.

플러스 : 모든 클러스터링 키는 각각의 단일 비 클러스터 인덱스의 각 단일 항목에 추가됩니다 (실제로 데이터베이스에서 레코드를 찾기위한 조회로서). = 4 바이트 대 GIDE = 16 바이트). 수억 개의 행과 몇 개의 비 클러스터 지수가있는 경우, 안내서를 통해 Int 또는 Bigint를 선택하면 우주 별도 큰 차이를 만들 수 있습니다.

마크

여러 데이터베이스로 가져 오기/내보내기를 고려해야 할 때 GUID를 사용하십시오. 여러 아동 관계의 데이터 세트로 작업 할 때 ID 속성을 지정하는 열보다 안내서는 종종 사용하기 쉽습니다. 이는 데이터베이스에서 연결이 끊긴 상태에서 코드의 안내를 무작위로 생성 한 다음 한 번에 모든 변경 사항을 제출할 수 있기 때문입니다. 안내가 제대로 생성되면 우연히 복제하기가 어렵습니다. Identity Column을 사용하면 자식 데이터를 추가하기 전에 새로운 ID에 대한 상위 행을 쿼리하고 쿼리를 삽입 해야하는 경우가 종종 있습니다. 그런 다음 데이터베이스에 커밋하기 전에 모든 자식 기록을 새 부모 신원으로 업데이트해야합니다. 손자에게도 마찬가지입니다. 불필요하고 평범한 것처럼 보이는 많은 작업을 구축합니다. 신원 사양없이 임의의 정수를 사용하여 Guid와 유사한 일을 할 수 있지만 시간이 지남에 따라 더 많은 레코드를 삽입함에 따라 충돌 가능성이 크게 증가합니다. (Guid.NewGuid ()는 아직 존재하지 않는 임의의 int128과 유사합니다).

나는 바이트 (tinyint), int16 (smallint), int32/uint16 (int), int64/uint32 (bigint)를 변경하지 않는 작은 조회 목록이나 여러 데이터베이스간에 복제되지 않는 데이터를 사용합니다. (권한, 응용 프로그램 구성, 색상 이름 등)

Guid를 사용하거나 오래 사용하는 경우에 관계없이 인덱싱이 쿼리하는 데 시간이 오래 걸린다고 생각합니다. 어쨌든 128 비트보다 큰 테이블에 다른 필드가 있습니다 (예 : 사용자 테이블의 사용자 이름). 안내서와 정수의 차이점은 메모리의 인덱스 크기와 시간을 채우고 재건축 인덱스의 크기입니다. 대부분의 데이터베이스 트랜잭션은 종종 읽고 있습니다. 글쓰기는 최소입니다. 일반적으로 적절하게 최적화되지 않은 결합 된 테이블, 부적절한 페이징 또는 누락 된 인덱스로 만들어 지므로 데이터베이스에서 먼저 읽기 최적화에 중점을 둡니다.

무엇보다도 가장 좋은 방법은 요점을 증명하는 것입니다. 두 개의 테이블로 테스트 데이터베이스를 만듭니다. 하나는 정수/장수의 주요 키가 있고 다른 하나는지도가 있습니다. 각각 n 백만 행으로 채우십시오. CRUD 작업 중에 각각의 성능 (생성, 읽기, 업데이트, 삭제). 당신은 그것이 성능에 맞지 만 중요하지 않다는 것을 알 수 있습니다.

서버는 종종 CPU, 메모리 및 하드 드라이브의 I/O (특히 RAID 포함)를 취하는 기타 응용 프로그램을 디버깅하지 않고 상자에서 실행합니다. 개발 환경은 성능에 대한 아이디어 만 제공합니다.

하루 종일지도 나 신원에 대해 토론 할 수 있습니다. 데이터베이스가 신원으로 고유 한 값을 생성하는 것을 선호합니다. 여러 데이터베이스에서 데이터를 병합하면 다른 열 (소스 데이터베이스, Tinyint 또는 Smallint를 식별)을 추가하고 복합 기본 키를 형성하십시오.

ID를 사용하는 경우 생성 할 예상 키 수를 기준으로 올바른 데이터 유형을 선택하십시오.

bigint - 8 Bytes - max positive value: 9,223,372,036,854,775,807  
int    - 4 Bytes - max positive value:             2,147,483,647

"예상 키 수"는 행의 수와 다릅니다. 주로 행을 추가하고 유지하면 int가 20 억 개가 넘는 고유 키로 충분하다는 것을 알 수 있습니다. 나는 당신의 테이블이 그렇게 크지 않을 것이라고 확신 할 것입니다. 그러나 행을 계속 추가하고 제거 할 수있는 대량 테이블이있는 경우 행 계수가 낮을 수 있지만 키를 빨리 통과합니다. INTS 20 억 키를 통과하는 데 로그가 어떻게 필요한지 확인하려면 계산을 수행해야합니다. 곧 int와 함께 사용하지 않으면 키 크기를 두 배로 늘리고 bigint로 이동하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top