2012-01-25 2 views
2

사용자의 GUID와 실제 이름을 문자열로 유지하는 테이블이 있습니다. 나는 사용자를 기반으로 몇 가지 정보를 얻고 싶다. 그러나 어떤 필드를 사용해야합니까? 내 코드는 다음과 같아야합니다.uniqueidentifier 나 tsql의 문자열을 비교하는 것이 더 빠릅니다.

select * 
from userinboxcount 
where countDate >= startDate and countDate <= endDate and userid = '<guid here>' 

or 

select * 
from userinboxcount 
where countDate >= startDate and countDate <= endDate and username = "FirstName LastName" 

답변

2

가장 큰 차이점은 하나의 필드에 데이터베이스에서 사용할 수있는 색인이 있고 다른 색인에서는 색인이없는 것입니다. 데이터베이스에서 값을 검색하기 위해 테이블의 모든 데이터를 읽어야하는 경우 디스크 액세스에 많은 리소스가 필요하므로 데이터 형식의 차이가 적절하지 않습니다.

두 필드에 모두 인덱스가 있으면 인덱스가 더 빨리로드되고 캐시에 남아있을 가능성이 높으므로 인덱스가 더 작습니다.

이상적으로 포함 된 필드로 반환 할 필드가있는 조건의 모든 필드에 대한 인덱스가 있어야합니다. 그런 식으로 쿼리는 인덱스에서만 결과를 생성 할 수 있으며 실제 테이블에서 읽지 않아도됩니다. 물론 select *을 사용하지 말고 실제로 반환해야하는 입력란을 지정해야합니다.

이외의 경우 간단한 숫자 비교이고 어휘 규칙을 고려할 필요가 없으므로 GUID 값을 비교하는 것이 다소 빠릅니다.

3

쿼리 계획을 확인하면 직접 볼 수 있습니다.

하지만 고유 식별자에는 일반적으로 색인이 있고 문자열 (username)에는 없을 수 있습니다. 그렇다면 많은 레코드가 있다면 prolly 고유 식별자가 빨라집니다!


쿼리 계획에는 THIS 문서를 확인하십시오.

0

userid이 기본 키인 경우이를 사용해야합니다. 성과 이름을 사용하는 경우 에 2 개의 John Smith 항목이있을 수 있으며 문제가 발생할 수 있습니다. PK를 사용하는 것이 더 안전해야합니다.

성능 측면에서 쿼리의 실행 계획 (실행 경로)에 익숙해지는 것이 좋습니다. userid을 사용하는 것이 더 빠를 것이라고 기대하지만, 계획을 확인하면 확실하게 알려야합니다.

1

당신은 완전히 GUID 결혼 있습니까? 여러 시스템에서 고유 할 기본 키가 필요할 때 GUID를 사용해야합니다. GUID 건너 뛰고 복합 키를 사용하는 것이 좋습니다. 예를 들어, ID와 GETDATE()를 복합 키로 사용할 수 있습니다. 이렇게하면 데이터 쿼리를 쉽게 할 수 있습니다 (정수에 대한 GUID를 기억해보십시오). 이것은 또한 GUID보다 훨씬 뛰어납니다. 아마도 두 배나 빠릅니다.

+0

그래, guid 및 사용자 이름은 타사 테이블/소프트웨어에서 가져온 것입니다. – dotnetN00b

관련 문제