'2019년 이전 정리/DB_MSSQL'에 해당되는 글 3건

  1. 2015.02.25 [MS-SQL] 실행계획 Nested Join Merge Join 문제해결
  2. 2014.02.13 [MSSQL] LEFT OUTER JOIN 예제
  3. 2014.02.10 [SQL] dateadd 문법
2015. 2. 25. 17:58

MS-SQL 실행계획 Nested Join Merge Join 문제 해결 



문제: 

운영계서버와 테스트서버의 쿼리 속도가 다르다. 실제 0.5 초도 안걸리는 쿼리인데, 운영계서버에서 5초이상 걸리는 문제가 발생하였다.


확인사항:

1. 버전의 문제로 소스가 운영계와 테스트 소스가 다른가?   같음

2. 쿼리의 문제인가?  맞음. 운영계가 5초이상 걸리는 문제 발생

3. 실행계획 비교.  운영계에서 nested join 발생. 


수정사항:

nested join 을 hint 를 통해 merge join 으로 변경   ->  해결 ( 테스트서버의 실행계획과 같음)


완벽한 방법인가?

hint 는 테이블의 조인방법과 조인순서를 결정한다고 한다.

hint 의 단점이 있을까? 아직은 단점이 무엇인지 잘 모르겠다.


알아두기

hint 는 merge join 을 사용 했는데 merge join 은 두테이블을 정렬한 다음에 두 집합을 병합(merge) 하면서 조인을 수행하는 것인데, 여기서 병합알고리즘을 사용한다.

두테이블을 정렬해서 사용한다면, union 을 통해  각 테이블을 조회 한 뒤에  조인하는 방식으로 사용 하면 병합과 같은 효과를 낼 수 있다.


추가내용

옵티마이저는 데이터에 양, index 에 달라질 수 있다.  두 서버의 데이터를 동일하게 맞추고, Index 도 맞췄는데 옵티마이저가 다르게 동작 했다. 이런...또 어떤 경우에 달라지는지 찾아보자.

*MS-SQL 에서는 EXEC SP_HELPINDEX 테이블명을 통해 index 를 볼 수 있다.

 hint 는 옵티마이저 업그레이드시에 hint 를 따라 가기 때문에 문제가 될 가능성이 있다. 쿼리 수정으로 하는게 좋음.




참조

-- join 설명 http://302.pe.kr/137

-- union 으로 변경  http://otep.tistory.com/70

-- 옵티마이저 공부 http://wiki.gurubee.net/pages/viewpage.action?pageId=26744562





'2019년 이전 정리 > DB_MSSQL' 카테고리의 다른 글

[MSSQL] LEFT OUTER JOIN 예제  (0) 2014.02.13
[SQL] dateadd 문법  (0) 2014.02.10
Posted by hoonihoon
2014. 2. 13. 14:56

SELECT *

FROM Orders order by CustomerID


OrderIDCustomerIDEmployeeIDOrderDateShipperID
10308271996-09-183
10365331996-11-272
10355461996-11-151
10383481996-12-163
10278581996-08-122


SELECT *

FROM Customers


CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constituci� 2222M�ico D.F.05021Mexico
3Antonio Moreno Taquer�Antonio MorenoMataderos 2312M�ico D.F.05023Mexico
4Around the HornThomas Hardy120 Hanover Sq.LondonWA1 1DPUK



두개를 LEFT OUTER JOIN 하게 되면


SELECT *

FROM Customers a

LEFT JOIN Orders b

ON a.CustomerID=b.CustomerID

ORDER BY Customers.CustomerName;


CustomerIDCustomerNameContactNameAddressCityPostalCodeCountryOrderIDEmployeeIDOrderDateShipperID
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germanynullnullnullnull
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constituci� 2222M�ico D.F.05021Mexico1030871996-09-183
3Antonio Moreno Taquer�Antonio MorenoMataderos 2312M�ico D.F.05023Mexico1036531996-11-272


결과에서 보면  LEFT OUTER JOIN 은 


ON CustomerID 를 기준으로 Orders 테이블과 일치하는 레코드가 없으면, Orders 테이블의 모든 컬럼이 담긴 row에 NULL을 넣는다


'2019년 이전 정리 > DB_MSSQL' 카테고리의 다른 글

[MS-SQL] 실행계획 Nested Join Merge Join 문제해결  (0) 2015.02.25
[SQL] dateadd 문법  (0) 2014.02.10
Posted by hoonihoon
2014. 2. 10. 17:46


dateadd( 날짜형식(yy,mm,dd,hh), 숫자, 날짜)


지정된 날짜에서 지정된 숫자만큼, 지정된 날짜형식을 변환시키겠다 라는 말이다.


dateadd(yy, 10, '2012-02-13")    결과 :  2020-02-13

dateadd(d, 10, '2012-02-13")     결과 : 2012-02-23



특정 시간이 됐을 때 이벤트가 발생하는 where 절이다.

아래 보면 2014년 1월 2일에 00시에 이벤트가 발생. 

아직 이벤트 시간이 안됐으면 발생 안함. where 절에 사용


where dateadd(hh, convert(int,evt_stime),convert(datetime,evt_sdate)) < getdate() 


해석:  dateadd(hh, 00, 2014-01-02)  < 현재시간()

Posted by hoonihoon