2013-04-24 3 views
0

나는SQLSERVER 2008 필요 제안

select count(distinct user1_.Id) as col_0_0_ from [FriendCloseness] friendclos0_ inner join [User] user1_ on friendclos0_.User_id=user1_.Id where dateadd(d, 0, datediff(d, 0, friendclos0_.LastUpdate))[email protected] and friendclos0_.IsInvited=1 and user1_.IsDeleted=0 and [email protected] 

테이블 사용자가 FriendCloseness FriendClossness 필드 LASTUPDATE와 쿼리, IsInvited, 사용자 필드에 isDeleted, 섹스에 가입이 쿼리를 여기서 쿼리

사용자 아이디 (기본 키) 와 관련된

테이블 사용자 구조 섹스,

FriendClossness 아이디, isDeleted를, (기본 키가 자동으로 기본 키에 설정된 인덱스를 DBMS 것인가?) LASTUPDATE (DATETIMEOFFSET), IsInvited, USER_ID (외래 키)

I을 어떤 필드를 색인화해야합니까? 색인을 생성해야하며 날짜 만 저장하는 새로운 필드 "InviteDate"를 작성하여 날짜 기능을 제거하고 싶습니다.

답변

1

시도해보십시오.

SELECT col_0_0_ = COUNT(DISTINCT u.Id) 
FROM (
    SELECT u.Id 
    FROM dbo.[User] u 
    WHERE u.IsDeleted = 0 
     AND u.Sex = @p1 
    --GROUP BY u.Id 
) u 
JOIN (
    SELECT 
      f.[user_id] 
     , LastUpdate = DATEADD(DAY, 0, DATEDIFF(DAY, 0, f.LastUpdate)) 
    FROM dbo.[FriendCloseness] f 
    WHERE f.IsInvited = 1 
) f ON f.[user_id] = u.Id 
WHERE f.LastUpdate = @p0 
+0

완벽하게 작동하지만 Devart가 왜 내가 처음 제거한 하위 쿼리에서 Group by를 제거하고 동일한 결과를 얻는 지 궁금합니다. – embarus

+1

그룹화는 JOIN의 수를 줄여야하며 이론적으로는 성능을 약간 향상시켜야합니다. 나는 테이블 사이의 관계를 알지 못했기 때문에 그것을 대략했다. 이 해결책이 당신에게 어울리는 경우에, 당신이 그것을 확인할 수 있다면 기쁠 것입니다. – Devart

+0

감사합니다. @Devart 신의 축복이 있기를 바랍니다. – embarus