블로그 이미지
SQL Server VS. 석이 minsouk@hotmail.com MSSQL 쿼리성능 관련해 궁금한 사항이 있다면 언제나 누구나 TeamViewer + Line (네이버 japan 메신저) 에 minsouk1 추가 후 연락주세요~ 010-9967-0955 보미아빠

카테고리

보미아빠, 석이 (441)
밥벌이 (16)
싸이클 (1)
일상 (1)
Total196,519
Today22
Yesterday61

달력

« » 2017.12
          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            

공지사항

http://d2.naver.com/helloworld/907716

 

 

* 계층적 질의 Hierarchical query

이걸 꼭 connect by prior id = mgrid 이렇게 쿼리문을 쓸 수 있어야 지원한다고 하는지는 모르겠다.

사실 나는 connect by 처럼 문법적으로 지원 하는것 보다 hierarchyid 처럼 자료구조를 새롭게 만들어 넣는것이 훨씬 빠르다고 생각한다. connect by 보다 훨신 빠를껄?

 

1) hierarchyid

https://msdn.microsoft.com/ko-kr/library/bb677173(v=sql.120).aspx

2) 혹은 CTE 제귀 쿼리를 사용해 구현. 이건 느리지요...

http://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/

3) 프로시저로 무한 뺑뺑이 구현

-_- 쉽지만.......이건 좀 아니잖아...

 

* temporal database

SQL Server 2016에서 지원한다. CTP 3 에서 지원됨

좀 늦게 나왔지만 잘 활용하면 좋은 기능일 듯

 

https://msdn.microsoft.com/ko-kr/library/dn935015.aspx

https://channel9.msdn.com/Shows/Data-Exposed/Temporal-in-SQL-Server-2016

 

활용으로는 replication 은 개시자는 기능을 끄고 구독자는 기능을 활성화 할 수 있다. 그러나 멀티 구독자는 local system clock 기준으로 구현되어 있어 데이터 정합성에 문제가 있을수 있어 지원하지 않는다고 한다. -_- 근디.......기거 복제 깨지면 관리가 될까 싶다.....

 

https://en.wikipedia.org/wiki/Temporal_database#Features 에 보면 재미있는 시나리오가 있다. 어떤 액션을 했는지 안했는지를 검사할 수 있다. 일반적으로 데이터베이스에  실제 기간과 사건이 기록된 시간이 적혀 있어야 한다. 그런데 다음과 같이 기록되어 있다면 이 사람이 Beachy 에 들어가고 나가고 했을 때 신고를 했는지 안 했는지 알 수가 없다.

 

Person(John Doe, Smallville, 3-Apr-1975, 26-Aug-1994).
Person(John Doe, Bigtown, 26-Aug-1994, 1-Jun-1995).
Person(John Doe, Beachy, 1-Jun-1995, 3-Sep-2000).
Person(John Doe, Bigtown, 3-Sep-2000, 1-Apr-2001).

 

그런데, 이렇게 기록하고 있다면 명확하게 그 행위가 언제 일어났는지 조회가 가능하다.

결국 이 사람은 2001년 2월 2일 BigTown 에 들어오면서 다시 신고를 했다는 것을 알 수 있다. 결국 Beachy 의 기록은 그 당시 신고를 하지 않았다는 것을 알 수 있다.

 

Person(John Doe, Smallville, 3-Apr-1975,  ∞,           4-Apr-1975,  27-Dec-1994).  
Person(John Doe, Smallville, 3-Apr-1975,  26-Aug-1994, 27-Dec-1994, ∞          ). 
Person(John Doe, Bigtown,    26-Aug-1994, ∞,           27-Dec-1994, 2-Feb-2001 ).
Person(John Doe, Bigtown,    26-Aug-1994, 1-Jun-1995,  2-Feb-2001,  ∞          ).
Person(John Doe, Beachy,     1-Jun-1995,  3-Sep-2000,  2-Feb-2001,  ∞          ).
Person(John Doe, Bigtown,    3-Sep-2000,  ∞,           2-Feb-20011-Apr-2001 ).
Person(John Doe, Bigtown,    3-Sep-2000,  1-Apr-2001,  1-Apr-2001,  ∞          ).

 

이것을 SQL Server 에서 자동으로 구현해 준것이 Temporal Table 기능이다. 이러면 언제 어떤 이벤트가 일어났는지 명확하게 다 추적이 가능하다. 뭐 시스템으로 직접 구현하는것도 가능하다만 자동으로 해주면 좋지 않은가? 사실 audit 이나 주요한 테이블 변동내역 추적에서는 대단히 좋은 기능일 수 있다.

 

 

* 문자열 집계

이건 사용자 펑션 하나만 만들어 넣으면 되는데 된다 만다라고 할만한 가치가 있는 것인지 잘 모르겠다. 다른방법으로  SQL Server 는 CLR 이라는 것이 지원되어 c# 으로 프로그램을 짜 넣으면 문자열을 정말 빠른 속도로 처리 가능하다. 심지어 multi thread application 도 작성 가능하다.

 

 



use tempdb 

go


if object_id('tblx') is not null

drop table tblx 

go


create table tblx 

(c1 int 

,c2 varchar(100)

)

go


insert into tblx values 

  (1, 'A')

, (2, 'B')

, (3, 'C')

, (4, 'D')

, (4, 'E')

go


select a.c1, stuff(b.c2, 1,3,'') c2

from 

(

select distinct c1 

from tblx 

) a

cross apply  

(

select ' / ' + c2 as [text()] 

from tblx 

where c1 = a.c1 for xml path('')

) b (c2)






 

* 정규표현식

이건 Version 얼마랑 비교한건지 모르겠다. 2005 부터 정규표현식이 지원되는데 지금 2016년이다.

그냥 비교하기 싫었나 보다.....ㅠ.ㅠ SQL Server 도 잘 됩니다. 동글뱅이 좀 쳐주세요~

https://msdn.microsoft.com/ko-kr/library/ms174214(v=sql.120).aspx

 

* deferred constraints

네 안되는것 같아요

 

* interval

네 없는것 같아요

 

* cascading Drop

네 안되는것 같아요

 

* Truncate 트리거

네 없는것 같아요

 

 

* row level trigger

네 안되는것 같아요

 

* join using

네 안되는것 같아요

 

* order by nulls last

네 안되는것 같아요

 

네, 오라클은 거의다 됩니다. 역쉬! 오라클 짱! 

 

* SQL Server 는 in-memory database, report service, column store, buffer pool 확장, analysis service, service broker, MARS, 압축, 암호화, R 등 쓸만한게 지원 됩니다.

 

* 상용 데이터베이스와 무료 데이터베이스의 비교는 .......

 

 

 

 

 

 

저작자 표시 비영리 변경 금지
신고
Posted by 보미아빠

최근에 달린 댓글

최근에 받은 트랙백

글 보관함