2009-05-14 3 views
3

나는 열이 user_id, email, default 인 테이블을 가지고있다. 전자 메일이 사용자 기본 전자 메일인지 여부에 따라 기본값은 'Y'또는 'N'을 저장합니다. 각 사용자는 기본 전자 메일을 하나만 가질 수 있습니다.두 개의 쿼리가 더 효율적입니까?

사용자가 테이블에서 업데이트 또는 삽입을 수행 할 때 내 SP에서 사용자가 isDefault를 'Y'로 전달했는지 확인합니다. 그렇다면 기본 'N'을 만들기 위해 해당 사용자의 모든 항목을 업데이트해야합니다. 내 질문은 : 어디에서 기본의

update table 
set default = 'N' 
where user_id = 'abc' 
and default = 'Y' 

(오버 헤드 : 더 잠금 문제 (두 개 이상의 스레드가 특정 사용자 테이블에서 데이터를 요청하지 않습니다) 이상 많은 시간이 소요되는 다음의 쿼리 사이에 하나가없는 고려 = 'Y'확인) 쿼리의 속도 SEV에 따라 모든 사용자에 대한 레코드)

답변

1

여기에 명확한 답변이 없습니다. 대부분의 레코드에서 기본값 = 'N'이면 효율성이 가장 좋습니다. 두 번째로, 대부분의 경우 기본값 = 'Y'이면 가장 좋습니다.

그래서 대부분의 사용자가 이메일 주소가 1 개인 경우 두 번째 검색어를 사용하십시오. 대부분의 사용자가 2 명 이상인 경우 첫 번째 사용자를 사용하십시오.

+0

쿼리의 속도가 가장 중요한 요소는 아닙니다. 불필요한 업데이트로 인해 더 큰 잠금이 발생한다는 사실과 업데이트가 실제로 변경되지 않은 경우에도 업데이트가 필요하다는 사실을 고려해야합니다. 값을 사용하여 테이블에 정의 된 UPDATE 트리거를 시작하십시오. –

0

갱신

OR

update table 
set default = 'N' 
where user_id = 'abc' 

(오버 테이블의 행 수, 색인, 점검 제한 조건 및 외부 및 기본 키와 같은 오류 요인.

적어도 SQL Server에서 어떤 것이 더 빠른지 확인하는 가장 좋은 방법은 쿼리를 실행할 때 포함 클라이언트 통계 및 실행 계획을 사용하는 것입니다. 각각의 시간을 비교하고 최선을 선택하십시오.

1

직접 사용해보십시오. SQL Management Studio에서 두 쿼리를 차례대로 실행하고 "실제 실행 계획 포함"을 활성화합니다. 어느 것이 든 비율이 높을수록 쿼리 속도가 느려집니다.

5

99 %의 확실성으로 나는 첫 번째 쿼리가 더 성능이 좋다고 말할 수 있습니다.

클러스터링 키가 user_id 일 가능성이 높습니다. 따라서 UPDATE 문은 업데이트 할 행을 매우 빠르게 찾을 것입니다. 업데이트는 SQL Server에서 논리적으로 삭제 및 삽입으로 구현되므로 상당히 비용이 많이 드는 작업이 될 수 있습니다 (간단한 조회와 관련이 있음). 업데이트가 기록에 배타적 잠금이 필요합니다, 모든 징후는 Oracle 전면에 문 1.

+0

그래, 좋아. 이전 코멘트를 읽기 전에 답을 읽어야합니다. 나는 당신의 뛰어난 이해에 굴복합니다. –

+0

@Aaron Alton : 절대적으로. 행에 배타적 잠금을 얻는 것이 아니라 오라클의 경우 UNDO (pka ROLLBACK)로 복사 된 블록의 사본을 사전 변경하고 모든 변경 사항을 다시 실행 로그에 기록합니다. 일반적으로 업데이트 할 필요가없는 행은 업데이트하지 않는 것이 좋습니다. – spencer7593

1

을 가리키고 있다는 사실과 함께, 나는의 옵션 1. 정렬 가고 싶어하는

커플.

각 사용자에 대해 하나의 기본 항목 만 적용되도록 고유 색인을 지정하면 해당 색인의 함수를 업데이트의 일부로 사용합니다. 업데이트해야하는 행만 업데이트합니다. 또한 고유 색인을 사용하면 주어진 사용자의 기본 전자 메일을 가져 오는 데 필요한 작업을 최소화 할 수 있습니다. 업데이트는 물론 행을 가져 오기 위해 해당 함수를 사용하는 곳이면 어디에서나 사용할 수 있습니다.

drop table user_email; 

create table user_email 
(userid varchar2(4) not null, default_ind varchar2(1) not null, 
email varchar2(30)); 

create unique index ue_x on user_email 
    (userid, decode(default_ind,'Y','Y',email)); 

insert into user_email (userid, default_ind, email) values ('fred','N','a'); 
insert into user_email (userid, default_ind, email) values ('fred','N','b'); 
insert into user_email (userid, default_ind, email) values ('fred','Y','c'); 

update user_email 
set default_ind = 'N' 
where userid = 'fred' 
and decode(default_ind,'Y','Y',email) = 'Y'; 

update user_email 
set default_ind = 'Y' 
where userid = 'fred' 
and email = 'a'; 

ps. "당신이 그것을 업데이트하기 위해 어쨌든 그 칼럼에 접근 할 필요가 있기 때문에,"default = 'Y'check "의 오버 헤드는 꽤 중요하지 않습니다.

관련 문제