일or놀이/MS-SQL

JOIN의 순서

TIGERJUNE 2006. 8. 29. 16:53

ALTER Proc dbo.up_AccountIDCheck

            @Loginid varchar(15),

            @reVal int output

as

Set Nocount on

Set Xact_Abort On

--SELECT Process

            IF EXISTS(Select 1 from tbl_Login where f_loginid = @Loginid)

            Begin

            set @reVal = 2     --중복된 아이디 존재

            return

            End

            IF EXISTS(Select 1 from tbl_JoinLimitation where f_field='loginid' and f_value = @Loginid)

            Begin

            set @reVal = 3     --가입제한 아이디

            return

            End

            SET @reVal = 0   --  중복된 아이디 없음

            Return

GO

[원래 쿼리]

IF EXISTS(Select 1 from tbl_JoinLimitation where f_field='loginid' and f_value = @Loginid)


[바꾼 쿼리
]

IF EXISTS(Select 1 from tbl_JoinLimitation where f_value = @Loginid and f_field='loginid')


원래 조건절에 f_field='loginid'가 먼저 처리 되도록 작성되었으나,

f_value = @Loginid 를 앞으로 보냄으로, 더 나은 속도향상을 보일수 있다.


이 원리는 Index Seek 에 있다.


f_value = @Loginid /
f_field='loginid'


이 둘중 어느것이 데이터가 더 많은가?
당연히 @Loginid 값은 unique한 데이터 이므로 1개씩 밖에 존재하지 않는다.

그러나. f_field='loginid' 이 데이터는 @Loginid 에 비해 더 많은 동일한 값이 존재한다.


f_value = @Loginid(아이디)를 먼저 찾고 f_field='loginid' 를 찾는다면 1번의 액세스로 끝나지만

f_field='loginid' 를 먼저 찾고 @Loginid 를 찾는다면, f_field='loginid' 의 존재수만큼 액세스가 이루어 지게 된다.