http://www.microsoft.com/downloads/details.aspx?familyid=C243A5AE-4BD1-4E3D-94B8-5A0F62BF7796&displaylang=ko

Express 라이센스 답게 무료입니다.

기본적인 기능은 모두 지원하는 만큼, MS-SQL을 사용하는 개발자에겐 필수 유틸리티라고 할 수 있겠죠.

'Database > MS-SQL' 카테고리의 다른 글

NewID - Create uniqueidentifier.  (0) 2010.08.11
sp_spaceused(Transact-SQL)  (0) 2010.07.27
Microsoft SQL Server Management Studio Express  (0) 2010.07.22
MS-SQL 실행 계획 확인  (2) 2009.03.26
MS-SQL 복원  (2) 2009.03.26
MS-SQL 백업  (4) 2009.03.26
Posted by 엘키 엘키

댓글을 달아 주세요

참고 자료
http://support.microsoft.com/kb/197297/ko


용어 정리
Driving Table : 조인에서 기준이 되는 테이블 (= Outer Table)
Drived Table : 조인에서 결합 되어지는 테이블 (= Inner Table)

Nested Loop
- 두개 이상의 테이블에서, Driving Table에서 먼저 조건에 맞는 집합을 만들고, Drived Table에서 조건이 맞는 결과를 얻어낸 후 Row를 결합하여 원하는 결과를 추출하는 방식 (Driving Table의 한 행당 Drived Table의 데이터 검색이 일어난다).
- 부분 범위 처리 가능 (정지, 재개 가능. 예를 들어 조건에 만족하는 데이터 1000개만 얻어낸 상태에서, 요청이 들어올경우 1001~2000번째 값을 얻어오는 것이 가능)
- Driving Table에서 상대 테이블로 비교할 데이터 량이 적은 것이 효율에 좋다.
- 기준 테이블과 상대 테이블 간에 서로 대응하는 값에 인덱스가 걸려있는 것이 효율에 좋다.
- 특정 범위만 알아오는 쿼리에 유용.
- Any Join에서 사용 됨.

Sort Merge
- 쿼리에 따라 기준 테이블, 상대 테이블 각각 조인에 포함될 데이터들만 추려내 테이블로 구성한 후 (집합을 구성), 추린 테이블의 데이터를 정렬해서 사용한다.
(상황에 따라 테이블 전체를 정렬해서 사용하는 경우도 있다.)
- 두 테이블의 크기가 다를 경우, 유후 시간 발생 (정렬 되는 시간이 동일하지 않기 때문에)
- 지그 재그 계단식 비교 방식을 취함 (읽고 있는 데이터 포인터를 기억한 후, 다음 데이터를 읽을 때 이미 읽은 위치를 다시 읽지 않는 방식으로 검색량을 줄인다.)
- 지그 재그 계단식 비교를 하기에, 겹치는 값이 존재할 경우 이미 읽은 데이터를 다시 읽어야 되는 상황이 발생하기도 한다. (같은 값이 여러개일 경우, 방금 읽었던 값도 또 읽어야 하기에) 그래서, 겹치는 값이 존재할 경우 DBMS가 Hash Join을 사용할 가능성이 높다.
- 추려진 결과가 한번에 나오고, 그 전에는 결과를 낼 수 없기에, 처리 속도가 중요한 쿼리에서는 사용되지 않는다.
- Any Join 에서 가능 하지만 주로 Equal Join 에서 유용.

Hash

- 테이블 내의 모든 데이터에 해시 함수를 적용하여 해시 버킷에 담는다. 값 별로 버킷에 나누어 담기에, 해당 버킷을 읽음으로써 같은 값을 사용하는 집합에 억세스 하는 방식이다.
- 해시 테이블 구성 비용 (CPU, 메모리)이 크다.
- 값 별로 버킷에 담기기에 버킷 억세스는 같은 값을 찾는 경우에만 빠르다. 그래서, Equal Join 에서만 가능하도록 되어있다.

 

'Database > MS-SQL' 카테고리의 다른 글

Microsoft SQL Server Management Studio Express  (0) 2010.07.22
MS-SQL 실행 계획 확인  (2) 2009.03.26
MS-SQL 복원  (2) 2009.03.26
MS-SQL 백업  (4) 2009.03.26
MS-SQL 조인 내부 처리 방식 정리  (0) 2009.03.26
MS-SQL 데이터 저장 방식  (0) 2009.03.26
Posted by 엘키 엘키

댓글을 달아 주세요

1. 인덱스  컬럼의 변형
select * from table  where LOWER(name)  ='word';
select * from table  where idx - 1 = 5;
이 처럼 인덱스에 변형을 가하게 되면, DBMS가 인덱스를 이용하지 않는다.

2. NOT 또는 IN 연산자 사용
NOT일 경우 무조건 인덱스를 안타는 것이 아니다.
NOT일 경우에도 인덱스를 타긴 타지만, 일반적으로, NOT에 사용된 값이 아닌 데이터의 비율이 높은 경우가 많기 때문에 인덱스를 타지 않는 경우가 많다.
마찬가지로 IN일 경우에도, IN에 포함된 데이터들의 비율이 매우 높다면 FULL SCAN을 하는 것이 낫다고 DBMS가 판단하면 인덱스를 타지 않는다.


3. 와일드 카드 LIKE문장에서 범위를 전체를 지정시
select * from table  where name like '%word'; 
문자열로 이루어진 값을 인덱스로 잡았을 때, %가 앞쪽에 사용되면 정렬 순서를 사용할 수 없으므로 테이블 FULL SCAN이 이루어진다.

select * from table  where name like 'word%'; 
당연한 얘기지만 쿼리가 이런 경우 인덱스를 탄다. 문자열 정렬 순서를 그대로 이용할 수 있기 때문이다.

4. 복합 컬럼 index에서 조건이 잘못되여 index 가 적용 되지 못하는경우
select * from table where name = 'word' or idx = 5

name과 idx가 둘다 인덱스가 걸려있는 경우라해도, DBMS가 최적의 OR 조건을 뽑기 힘들어, FULL SCAN 하는 경우가 많다.

5. Optimizer 의 선택
select * from table  where name ='word' and  id ='elky'; 

인덱스가 name 과   id로 2개가 있을 경우 id나 name 인덱스 중 하나가 선택될수도 있고, 둘다 선택 될 수도있다.
어떤 방식으로 선택하는냐가 속도에 중요할수도있다. 즉 실행 계획을 추적해서 원하는 결과가 나오도록 관리가 필요하다

Posted by 엘키 엘키

댓글을 달아 주세요

이전버튼 1 이전버튼

블로그 이미지
Software Engineer
엘키

공지사항

Yesterday31
Today29
Total1,605,483

달력

 « |  » 2020.8
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

글 보관함