1. 저장 프로시져 생성시 SET NOCOUNT ON 옵션을 활성화하라
네트워크 소통량을 줄일수 있다.(DONE_IN_PROC 메시지 발
생이 비활성화 되기 때문에 클라이언트로 결과행 갯수를
알려주는 패킷을 전달할 필요가 없다)
2. 프로시져 호출시 소유자를 지정하는 것이 좋다. 소유자를 생략하면
프로시져 캐시에서 프로시져를 찾을수 없기 때문에 SQL 서버가 그
프로시져에 대해 컴파일 잠금을 수행하게 된다.
3. 동적 T-SQL 을 실행할때는 EXEC() 보다 sp_excutesql 을 사용하는것이
좋다.sp_excutesql을 사용하게 되면 실행계획이 캐시로 저장되어 나중에
재사용 될 수 있는 이점을 가지게 때문이다.
* 실행계획이 캐쉬에 있으면 그 프로시져가 호출될때 실행계획을 새로 만들지
않고 캐시에 있는 것을 재사용할 수 있다. 이렇게 되면 프로시져를
처음 실행할때 행하는 쿼리 트리구성과 계획 생성 작업을 수행하지 않아도 되며.
이것이 T-SQL 일괄 처리 보다 뛰어난 성능상의 장점이다.
4. RPC 요청은 SQL Server의 많은 명령문 구문 분석과 매개 변수 처리를 무시하며
Transact-SQL EXECUTE 문을 사용하는 것보다 빠르게 진행됩니다
5. 오브젝트 이름에 소유자를 지정하는 것이 성능향상에 도움이된다.
프로시져의 경우 소유자를 지정하지 않으면 SQL 서버는 그 프로시져에 대해
컴파일 잠금을 필요로 하는데 결국은 SQL서버가 실행계획이 필요하지 않다는
판단을 하게 되어 불필요한 잠금을 하게 되는것이다.이렇게 되면 블로킹 경합을
유발할수 있게 때문에 프로시져 호출시 DB.DBO.proc 의 형태로 호출을 하는것이
성능향상에 유리하다.
6. 임시 테이블을 사용하지 않는것이 유리하다.TEMPDB 에서 리소스 경합이 발생하여
뜻하지 않은 저장 프로시져 재 컴파일과 같은 결과를 가져올 수 있다. table 변수를
사용하게 되면 임시 테이블을 사용하는 것과 같은 일들을 할 수 있다.임시 테이블을
사용했다면 그 사용이 끝났을 경우 꼭 임시 테이블을 삭제한다. 시스템 리소스를 잡아
먹을수 있다.
7. HAVING 절 보단 WHERE 을 사용하라. HAVING 을 인덱스 스캔을 하고 where 는 인덱스
seek를 한다. HAVING을 사용한 경우에는 내부적으로 필터링 방식으로 변환해 주지만
인덱스 사용방식이 비효율적인 방식으로 남아 있기 때문에 where 절을 이용하는것이
더 좋다.
네트워크 소통량을 줄일수 있다.(DONE_IN_PROC 메시지 발
생이 비활성화 되기 때문에 클라이언트로 결과행 갯수를
알려주는 패킷을 전달할 필요가 없다)
2. 프로시져 호출시 소유자를 지정하는 것이 좋다. 소유자를 생략하면
프로시져 캐시에서 프로시져를 찾을수 없기 때문에 SQL 서버가 그
프로시져에 대해 컴파일 잠금을 수행하게 된다.
3. 동적 T-SQL 을 실행할때는 EXEC() 보다 sp_excutesql 을 사용하는것이
좋다.sp_excutesql을 사용하게 되면 실행계획이 캐시로 저장되어 나중에
재사용 될 수 있는 이점을 가지게 때문이다.
* 실행계획이 캐쉬에 있으면 그 프로시져가 호출될때 실행계획을 새로 만들지
않고 캐시에 있는 것을 재사용할 수 있다. 이렇게 되면 프로시져를
처음 실행할때 행하는 쿼리 트리구성과 계획 생성 작업을 수행하지 않아도 되며.
이것이 T-SQL 일괄 처리 보다 뛰어난 성능상의 장점이다.
4. RPC 요청은 SQL Server의 많은 명령문 구문 분석과 매개 변수 처리를 무시하며
Transact-SQL EXECUTE 문을 사용하는 것보다 빠르게 진행됩니다
5. 오브젝트 이름에 소유자를 지정하는 것이 성능향상에 도움이된다.
프로시져의 경우 소유자를 지정하지 않으면 SQL 서버는 그 프로시져에 대해
컴파일 잠금을 필요로 하는데 결국은 SQL서버가 실행계획이 필요하지 않다는
판단을 하게 되어 불필요한 잠금을 하게 되는것이다.이렇게 되면 블로킹 경합을
유발할수 있게 때문에 프로시져 호출시 DB.DBO.proc 의 형태로 호출을 하는것이
성능향상에 유리하다.
6. 임시 테이블을 사용하지 않는것이 유리하다.TEMPDB 에서 리소스 경합이 발생하여
뜻하지 않은 저장 프로시져 재 컴파일과 같은 결과를 가져올 수 있다. table 변수를
사용하게 되면 임시 테이블을 사용하는 것과 같은 일들을 할 수 있다.임시 테이블을
사용했다면 그 사용이 끝났을 경우 꼭 임시 테이블을 삭제한다. 시스템 리소스를 잡아
먹을수 있다.
7. HAVING 절 보단 WHERE 을 사용하라. HAVING 을 인덱스 스캔을 하고 where 는 인덱스
seek를 한다. HAVING을 사용한 경우에는 내부적으로 필터링 방식으로 변환해 주지만
인덱스 사용방식이 비효율적인 방식으로 남아 있기 때문에 where 절을 이용하는것이
더 좋다.