2013-07-04 4 views
4

SQL Server 2008 R2 데이터베이스에는 국가가 포함 된 COUNTRIES 참조 테이블이 있습니다.PRIMARY KEY를 NVARCHAR 유형에서 INT 유형으로 전환해야합니까?

create table COUNTRIES(
    COUNTRY_ID nvarchar(50) PRIMARY KEY, 
    ... other columns 
) 

기본 키이 표는 최대 포함 등 'FR', 'GER', '미국', '영국'과 같은 값을 포함하십시오 PRIMARY KEY은 NVARCHAR 열입니다. 20 행.

create table SALES(
    ID int PRIMARY KEY 
    COUNTRY_ID nvarchar(50), 
    PRODUCT_ID int, 
    DATE datetime, 
    UNITS decimal(18,2)   
    ... other columns 
) 

이 판매 테이블도 유형 nvarchar의, COUNTRY_ID라는 이름의 열을 포함 (안 기본 키) :

우리는 또한 SALES 테이블에 포함 된 판매 데이터가 있습니다. 이 테이블은 훨씬 크며 약 2,000 만 개의 행을 포함합니다.

SALES 테이블에서 쿼리 할 때 우리는 거의 언제든지 COUNTRY_ID에서 필터링합니다. 이와 같이 심지어 대부분의 집계 쿼리를 수행하는 데 너무 오래 걸린다. (적절한 인덱스가 있더라도)

SALES 테이블의 쿼리 성능을 향상시키기 위해 개발 단계에 있습니다. 내 질문 :

에서 int으로 COUNTRY_ID 유형을 전환 할 가치가 있습니까?COUNTRY_ID 열이 두 테이블에서 모두 int 유형으로 변환되는 경우 두 테이블을 조인 할 때 더 나은 성능을 기대할 수 있습니까?

+0

전위 [중복 (http://stackoverflow.com/questions/332300/is-there-을 사용하여 환원되어 있는지 확인할 수 a-real-performance-difference-int-and-varchar-primary-keys)를 사용합니다. – Scott

+0

@Scott - 이벤트가 거의 같은 경우, 질문은 SQL Server가 아니라 MySQL을 참조합니다. 거기에있는 몇 가지 대답이 필자의 경우와 일치 할 수 있지만 SQL Server에 대한 기술적 인 대답 (일부 경우도 있음)을 얻고 자합니다. 너희들이 내 질문을 닫지 않기를 바란다. – Lucian

+0

조인이있을 때 int가 더 빨라지 겠지만, 다른 한편으로는 의미 론적 기본 키를 가짐으로써 종종 국가 테이블에 가입 할 필요가 없다는 것을 의미 할 수도있다. 외래 키에 직접 필터링하십시오. – alun

답변

5

개인적으로 을 nvarchar(50)에서 INT으로 변경하는 것이 좋습니다. int는 4 바이트의 데이터를 사용하며 일반적으로 JOINVARCHAR보다 빠릅니다.

또한 사용 공간이있는 stored procedure sp_spaceused

EXEC sp_spaceused 'TableName' 
+0

'sp_spaceused'에 대한 감사. 필자는 몇 가지 테스트를 수행했으며 데이터 (1855488KB 대 1751408KB)가 사용하는 공간에서 101Mb 만 얻었습니다. 인덱스가 차지하는 공간 (91Mb의 차이)과 거의 동일합니다. 나는이 점에서 많은 차이가 없다고 생각한다. – Lucian

+0

@ 루시 안 (Lucian) - 여전히 저장 공간이 충분합니다. 테이블이 커지면 절약 된 공간이 가치있게됩니다. –

관련 문제