728x90
얼마전에 올렸던 포스팅에서 OpenXML을 이용하여 대용량 XML 형태 데이터를 MS-SQL 데이터베이스에 효과적으로 넣는 방법에 대해서 공유를 했었다. 하지만 OpenXML 을 이용하는 방법은 조금 까다로운 감이 없지 않고 구문이 복잡해져서 복잡한 XML 데이터를 핸들링 할때는 불편한게 사실이다.

오늘 소개해 드리는 방법은 이보다 더 간단한 방식으로 SQL Server 2005, 2008 등에서 XML 에 대한 자체적인 지원을 시작하면서 사용 가능해진 방법이다. OpenXML 을 이용하는 방법보다 단순하게 쿼리를 만들 수 있는 장점이 있는 반면 OpenXML 이 상당히 구체적으로 노드와 어트리뷰트, 값을 지정해서 뽑아내는 것보다 명확하지 않아 보일 수 있는 단점도 있다.
DECLARE @x XML

SET @x = N'
  
    1
    2
    3
  
'

SELECT 
	x.y.value('@name[1]', 'VARCHAR(20)'),
	x.y.value('.', 'INT')
FROM @x.nodes('my_data/item_list/item') as x(y)
변수를 XML 형태로 선언을 하고 파싱을 하고자 하는 XML 데이터를 이 변수에 넣어주는 것에서부터 시작해 보자. 데이터는 객체의 nodes 라는 속성을 통해서 읽어내고자 하는 XML 의 노드를 지정하여 데이터 소스로 사용하게 된다. Select 문에서 읽어들인 값에 대해 .value 속성을 통해 이름과 자료형을 기술해주면 데이터가 파싱되어 결과로 출력된다.


- NoPD -
728x90
728x90
데이터베이스 서버나 개발시 로컬 인스턴스 환경에서 유용하게 사용될 수 있는 것이 벌크 인서트(Bulk Insert) 기능이다. 샘플 데이터 라던가 코드성 데이터들을 한번에 쉽게 테이블에 넣을 수 있는 방법으로 많이 애용되고 있다. 그런데 벌크 인서트는 로컬의 파일 시스템에 저장된 텍스트 파일을 이용하는 방식이기 때문에 리모트에서 동작하는 ASP.NET 어플리케이션과 같은 클라이언트는 사용할 수 없는 기술이다.

그렇다면 대용량의 데이터를 한번에 넣을 수 있는 좋은 방법은 없을까? 수백건의 데이터를 한번에 테이블에 넣는 것과 같은 작업을 insert 문을 이용해 행의 갯수만큼 돌린다면 트랜잭션의 관리를 포함하여 도저히 감당하기 힘든 느린 속도를 경험하게 될 것이다. 이럴 때 유용하게 사용할 수 있는 것이 바로 OpenXML 을 이용한 대용량 데이터의 삽입이 아닐까 싶다.

원리는 간단하다. 한번에 넣어야 하는 데이터를 XML 형태로 구성해서 데이터베이스 서버에 전달하고 이를 서버측 스토어드 프로시저가 OpenXML 을 이용하여 DTD 에 맞추어 데이터를 추출하고 테이블에 넣는 방법이다. 서버측 자원을 사용하게 되는 단점이 있지만 insert 문을 행의 갯수만큼 반복하는 것보다는 훨씬 효과적인 방법이라고 생각된다.
functio foo()
{

}


SET TEXTSIZE 100000


DECLARE @docHandle int

DECLARE @data varchar(max)


SET @data = '

<Logs Hostname="MyServer">

   <Log C="/Central Process Unit/Process Time Limit is never comes along with me yeah1" I="/Item Name Can Be many Things1" V="0.306316345601545" D="2011-05-04T01:01:01" />

</Logs>

'


EXEC sp_xml_preparedocument @docHandle OUTPUT, @data


SELECT *

  FROM OPENXML(@docHandle, '/Logs/Log', 2)   -- 0,1 : Attibute-Centric , 2 : Element-Centric

  WITH (Hostname varchar(50) '../@Hostname',

        CounterCategory varchar(100) '@C',

        CounterItem varchar(100) '@I',

        VounterValue decimal(13,1) '@V',

        CheckDate datetime '@D')


대용량 데이터의 저장을 위해서 XML 을 구성하면 필연적으로 그 용량이 커지게 된다. MS-SQL 의 varchar 타입은 최대 8000 바이트까지 밖에 허용하지 않고 DECLARE 로 선언 가능한 내부 변수에 text 타입은 빠져있다. 따라서 SET TEXTSIZE 구문을 통해서 max 값을 충분히 늘려준뒤 varchar(max)를 사용하면 해결할 수 있다.

XML 로 구성하는 데이터의 형식은 자유이다. DTD 를 별도로 만들지 않아도 되고 형식만 잘 맞추어주면 된다. OpenXML 은 노드를 구조를 지정하고 애트리뷰트 단위(Attribute) 혹은 엘레멘트 단위(Element)로 지정할 수 있다. 디렉토리 이동시와 마찬가지로 ../ 와 같은 구문을 이용하면 XML 의 모든 요소에 엑세스가 가능하다.



- NoPD - 
728x90
728x90
요즘 NoSQL 에 대한 관심이 무척 높다.
실시간으로 쏟아지는 데이터를 처리하기 위해서
기존 RDBMS 는 "전혀" 적합하지 않다는 것이 많은 사람들의 지론이다.
그래서 등장하는 많은 대체제 중에 NoSQL 은 이름에서 부터 이미 압박이 심하다.

NoSQL 자체가 제품 이름은 아니고 일종의 새로운 DB 형태를 일컫는 말이다.
NoSQL 제품으로 Google 의 BigTable, Amazon의 Dynamo 와 같은 것들이 유명하다.

자세한 내용은 천천히 시간을 두고 살펴보기 위해
일단 손에 걸린(?) 것들을 링크만 정리해 둬본다.

- Wikipedia 에 정의된 NoSQL : http://en.wikipedia.org/wiki/NoSQL

 

Outsider 님의 NoSQL 관련 포스팅
1. NoSQL에 대해서 #1 (http://blog.outsider.ne.kr/519)
2. NoSQL에 대해서 #2 (http://blog.outsider.ne.kr/520)

Fatazic 님의 관련 포스팅
1. NoSQL 정의와 사례정리 (http://fantazic.com/archives/517)

Channy 님의 관련 포스팅
1. NoSQL, 소셜웹 시대의 대안? (http://blog.creation.net/459

 

국산 NoSQL 솔루션
1. Cloudata (http://www.cloudata.org/)

Facebook 의 HBase 성능 분석자료
1. Facebook`s New Realtime Analytics System (http://highscalability.com/blog/2011/3/22/facebooks-new-realtime-analytics-system-hbase-to-process-20.html

 
- NoPD - 
728x90
728x90
비지니스 로직에서 데이터베이스 관련 구문을 사용하지 않기 위해 종종 Stored Procedure 로 많은 로직을 옮기곤 합니다. View 와 Logic 을 분리한다는 차원 이외에도 보안적인 측면이나 불필요한 에러를 막기 위한 것 이외에도 Strongly Typed 프로그래밍의 명확한 적용을 위해서라도 유용한 방법입니다.

SP 를 사용하는 몇 안되는 단점 중 하나가 에러처리 부분이 아닐까 싶습니다. NoPD 군은 그동안 SQL 구문 날코딩을 사랑하다 최근 SP 로 로직을 모두 옮기어 조그만 프로젝트를 하나 하고 있는데, 여기저기 검색하다가 정갈하게 정리된 내용을 발견해서 공유할까 합니다.

   SELECT @err = @@ERROR, @row = @@ROWCOUNT
   IF @err != 0 OR @row != 1
   BEGIN
    SET @result = 'sp_commitContent|컨텐츠 수정에 문제가 있습니다. 관리자를 컨택해 주세요.'
    GOTO ERROR
   END
   
   ERROR:
    RAISERROR(@result, 11, 1)
    RETURN
@@ERROR 값과 @@ROWCOUNT 값을 같이 이용하여 쿼리가 정상적으로 수행 되었는지를 확인하는 방법이 바로 그것입니다. 이미 다들 아시는 내용일지 모르겠으나 DB 를 날쿼리 중심으로 쓰던 NoPD 군에게는 새로운 SQL 구문이 아닐 수 없습니다! ^^

- NoPD -
728x90

+ Recent posts