BLOG main image
분류 전체보기 (65)
JSP (6)
Android (1)
ASP.NET (0)
MSSQL (4)
PHP (18)
ASP (11)
오픈 API (1)
HTML (2)
JavaScript (0)
Windows Programming (8)
컴퓨터교양 (14)
객체 지향 (0)
리뷰 및 생각 (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
'MSSQL'에 해당되는 글 3건
2013. 11. 14. 11:13
MSSQL은 쿼리에 따라 실행계획을 세우기도 하지만, 
데이터 상황에 따라 실행계획을 알맞게 다시 세워서 수행하기도 한다.
만약 데이터 양이 늘어나서 쿼리 수행 속도가 느려졌다면,
실행계획에 병렬처리가 있는지 확인하고, 없다면 merge 키워드를 사용하여 병렬처리를 하도록 지시하자.

위의 실행계획은 똑같은 쿼리에 merge 조인하라고 힌트를 주느냐 마느냐에 따라 달라지는 실행계획을 보여준다.
첫번째 실행계획대로 쿼리가 수행되면 약 2분 정도의 시간이 걸린다.(left join)
두번째 실행계획대로 쿼리가 수행되면 약 2초 밖에 안걸린다.(left merge join)

merge 키워드는 물리적으로 어떻게 조인 할 것이냐를 직접적으로 지정하는 키워드 이다.
(참고로 inner join, outer join 등은 논리적 조인 키워드 이다.)
위 실행계획에서 보듯이 merge가 들어가면 병렬(페러럴) 처리가 이루어짐을 알 수 있다.

복잡한 쿼리를 수행 할 때 병렬처리를 하지 않으면 쿼리 수행시간이 지나치게 길어 질 수 있다.
같은 쿼리인데, 갑자기 속도가 느려졌다면 병렬처리를 하고 있는지 확인해 보고,
그렇지 않다면 merge 키워드를 추가하여 강제로 병렬처리를 하도록 지시하자.

참고 : http://blog.naver.com/PostView.nhn?blogId=ssayagain&logNo=90036001354&from=search

2013. 11. 14. 09:56

--테스트 DB/TABLE 준비
use master

create database test20131114
go

use test20131114

create table A
(
    id int
)

create table B
(
    id int
)

insert into A values (1)
insert into A values (2)
insert into A values (3)
insert into A values (4)
insert into A values (5)

insert into B values (1)
insert into B values (2)
insert into B values (3)
/*
위와 같이 A 테이블(집합 A)에는 1,2,3,4,5가 있고,
              B 테이블(집합 B)에는 1,2,3이 있다.
집합 A에서 집합 B를 뺀 차집합은 4,5가 된다.
수학 기호로는 A-B={4,5} 이다.
*/

 


--가장 간결한 방법
select id
from A
except
select id
from B
/*
EXCEPT 및 INTERSECT
두 쿼리의 결과를 비교하여 고유한 값을 반환합니다.
EXCEPT는 오른쪽 쿼리에 없는 고유한 값을 왼쪽 쿼리에서 반환합니다.
INTERSECT는 INTERSECT 피연산자의 왼쪽과 오른쪽에 있는 두 쿼리에 의해 반환된 고유한 값을 반환합니다.
참고 : http://msdn.microsoft.com/ko-kr/library/ms188055.aspx
*/

 


--NOT IN을 이용한 방법
select id
from A
where id not in (
    select id
    from B
)
/*
부연참고 : http://smartweb.tistory.com/4
*/

 


--IS NULL을 이용한 방법
select A.id
from (
    select id
    from A
) A
left join (
    select id
    from B
) B on B.id=A.id
where B.id is null

2013. 8. 30. 00:01

미국의 통화는 달러.센트로 표현하기 때문에 소수점부를 사용한다.

그래서 moeny 타입은 소수점부에 값을 입력할 수 있다.

반면 한국의 통화는 소수점부를 사용하지 않는다.

따라서 money 타입에 값을 설정할 때에는 CEILLING() 함수나 FOOLR() 함수를 통해

정수값만 추출하여 설정하는 것이 안전하다.

 

간혹 money 타입의 소수점부에 값이 설정되어, 1원 이하의 차이로 인한 버그가 생길 때가 있다.

이럴 때는 소수점부에 값이 설정되어 있는지 조회해 봐야 한다.

declare @point money=12345.12345
select @point - floor(@point)

위와 같이 FLOOR() 함수를 통해 소수점부를 절사한 다음, 원래 값에서 빼주면, 소수점부 이하의 값만 남게 된다.

 

실제 레코드를 조회하는 방법은 아래와 같은 방식으로 한다.

select *
from points
where point - floor(point) > 0

위와 같이 조회하면 소수점부 이하에 값이 설정된 레코드만 추출될 것이다.

prev"" #1 next