2013-04-15 5 views
0

나는 다음과 같은 스크립트를 사용했지만 사용자 기반이 거의 백만 명으로 늘어 났으므로 스크립트가 매우 느립니다. 나는 코딩을 변경하거나, 인덱스를 생성하거나, 두 가지 모두를 사용하여이를 향상시키고이를보다 빨리 수행 할 수있는 전문가의 도움이 필요합니다. 코드는 다음과 같습니다.인덱싱을 사용하여 스크립트 속도 향상

IF @MODE = 'CREATEREQUEST' 
    BEGIN 
     IF NOT EXISTS (SELECT * FROM FriendRequest WHERE FromMemberID = @FromMemberID AND ToMemberID = @ToMemberID) 
     AND NOT EXISTS (SELECT * FROM MemberConnection WHERE MemberID = @FromMemberID AND ConnMemberID = @ToMemberID) 
     AND NOT EXISTS (SELECT * FROM MemberConnection WHERE MemberID = @ToMemberID AND ConnMemberID = @FromMemberID) 

     BEGIN 
      INSERT INTO FriendRequest (
       FromMemberID, 
       ToMemberID, 
       RequestMsg, 
       OnHold) 
      VALUES (
       @FromMemberID, 
       @ToMemberID, 
       @RequestMsg, 
       @OnHold) 
     END 
     BEGIN 
      UPDATE Member SET FriendRequestCount = (FriendRequestCount + 1) WHERE MemberID = @ToMemberID 
     END 
END 

제공 할 수있는 모든 도움을 주시면 대단히 감사하겠습니다.

+0

[게시물에 서명 또는 태그 라인을 사용하지 마십시오.] (http://stackoverflow.com/faq#signatures). – meagar

+3

천천히 실행중인 문을 식별하기 위해이 코드를 프로파일 링 했습니까? 실행 계획은 무엇입니까? – Pondlife

+2

** 테이블 정의, 실행 계획 및 모든 현재 인덱스 **를 포함하지 않으면 어떤 개선이 이루어질 수 있는지 알 수 없습니다. – JNK

답변

1

SQL Server Management Studio를 사용하여 테이블의 인덱스를 볼 수 있습니다. 예를 들어 FriendRequest 테이블에 FriendRequestID에 PK가 있으면 해당 필드에 클러스터형 인덱스가 있음을 알 수 있습니다. 테이블 당 하나의 클러스터 된 인덱스 만 가질 수 있으며 테이블 레코드는이 순서대로 저장됩니다.

외래 키 필드에 클러스터되지 않은 인덱스를 추가하려고 할 수 있습니다. 이 같은 새 색인 마법사, 또는 다른 구문을 사용할 수 있습니다

CREATE NONCLUSTERED INDEX [IX_FromMemberID] ON [dbo].[FriendRequest] (FromMemberID) 
CREATE NONCLUSTERED INDEX [IX_ToMemberID] ON [dbo].[FriendRequest] (ToMemberID) 

을하지만 색인은 일반적으로 코드에서 보여 INSERT 및 UPDATE 작업을 늦출 것이라는 점을 알고 있어야합니다. 일반적으로 인덱싱 된 필드를 사용할 수있는 SELECT 쿼리 속도를 높이는 경향이 있습니다 (Execution Plans 참조).

Database Engine Tuning Advisor을 사용하면 가능한 인덱스와 응용 프로그램의 작업 부하에 미치는 영향을 알 수 있습니다.

색인 생성은 큰 문제이므로 한 번에 작은 단계로 진행할 수 있습니다.

+3

FYI : PK가 반드시 클러스터 될 필요는 없습니다. 이 두 가지가 항상 함께 있다는 신화를 퍼뜨 리지 마십시오. –