저작자 표시 비영리 변경 금지
신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소

Tag db, SQL, XQuery

출처 : http://laigo.kr/723


SQL Server 2012 에서 XML 문서를 테이블에 Bulk Insert 하는 방법과 XQuery 를 사용하여 XML 데이터를 검색하는 몇 가지 예제를 아래와 같이 정리하였습니다.

 

 

1. XML 원본 문서를 테이블에 Bulk Insert 하는 방법

CREATE DATABASE XMLDB
GO

 

USE XMLDB
GO

 

CREATE TABLE TBL_XML (
 ID  INT IDENTITY PRIMARY KEY,
 XMLDATA XML 
)
GO

INSERT INTO TBL_XML(XMLDATA) 
SELECT * FROM OPENROWSET (
     BULK 'D:\SQL\BOOKS.XML', SINGLE_BLOB) AS x;

 

 

 

2. XQuery 를 사용하여 XML 데이터 검색 예제 

CREATE TABLE TBL_XQUERY (
 ID  INT IDENTITY PRIMARY KEY,
 XMLDATA XML 
)
GO

INSERT INTO TBL_XQUERY VALUES ('
 <CATALOG> 
  <book id="bk101">
   <author>Gambardella, Matthew</author>
   <title>XML Developer''s Guide</title>
   <genre>Computer</genre>
   <price>44.95</price>
   <publish_date>2000-10-01</publish_date>
   <description>An in-depth look at creating applications with XML.</description>
  </book> 
 </CATALOG>
')

INSERT INTO TBL_XQUERY VALUES ('
 <CATALOG> 
  <book id="bk102">
    <author>Ralls, Kim</author>
    <title>Midnight Rain</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-12-16</publish_date>
    <description>A former architect battles corporate zombies, n evil sorceress, and her own childhood to become queen of the world.</description>
  </book>
 </CATALOG>
')

INSERT INTO TBL_XQUERY VALUES ('
 <CATALOG> 
    <book id="bk103">
    <author>Corets, Eva</author>
    <title>Maeve Ascendant</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-11-17</publish_date>
    <description>After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.</description>
    </book>
 </CATALOG>
')

 

 

SELECT XMLDATA.query('/CATALOG/book')
FROM TBL_XQUERY
WHERE ID = 2
/*
<book id="bk102">
  <author>Ralls, Kim</author>
  <title>Midnight Rain</title>
  <genre>Fantasy</genre>
  <price>5.95</price>
  <publish_date>2000-12-16</publish_date>
  <description>A former architect battles corporate zombies, n evil sorceress, and her own childhood to become queen of the world.</description>
</book>
*/

 


SELECT XMLDATA.value ( '(/CATALOG/book/@id)[1]', 'char(5)' ) AS 'Book id'
FROM TBL_XQUERY
/*
bk101
bk102
bk103
*/

 


SELECT XMLDATA 
FROM TBL_XQUERY
WHERE XMLDATA.exist('/CATALOG/book[@id="bk103"]') = 1
/*
<CATALOG>
  <book id="bk103">
    <author>Corets, Eva</author>
    <title>Maeve Ascendant</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-11-17</publish_date>
    <description>After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.</description>
  </book>
</CATALOG>
*/

 


SELECT 
 nCol.value('@id', 'char(5)') AS 'Book id', 
 nCol.value('(author)[1]', 'varchar(10)') AS author,
 nCol.value('(title)[1]', 'varchar(50)') AS title,
 nCol.value('(genre)[1]', 'varchar(10)') AS genre
FROM TBL_XQUERY 
CROSS APPLY XMLDATA.nodes('/CATALOG/book') AS nTbl(nCol)
ORDER BY ID
/*
bk101 Gambardell XML Developer's Guide Computer
bk102 Ralls, Kim Midnight Rain   Fantasy
bk103 Corets, Ev Maeve Ascendant   Fantasy
*/

 

 

 

[참고자료]

Examples of Bulk Import and Export of XML Documents (SQL Server)
http://msdn.microsoft.com/en-us/library/ms191184.aspx

 

XQuery 언어 참조(SQL Server)
http://msdn.microsoft.com/ko-kr/library/ms189075.aspx

 

저작자 표시 비영리 변경 금지
신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소

출처 : http://eincs.net/2012/06/nosql-is-not-useful/

 

 

NoSQL이라고 일컫는 분산 데이터베이스들이 요즘 트렌드다. 뛰어난 확장성과 가용성으로 각광을 받고 있다. 실제로 여러 소셜게임업체들이 NoSQL을 사용하며, 넷플릭스 또한 NoSQL인 Hbase와 Cassandra를 주요 저장소로 사용[1]한다. 그리고 페이스북의 메신저 시스템[2] 및 실시간 분석 시스템[3] 또한 HBase기반으로 만들어졌다. NoSQL을 사용하면 RDBMS에서의 불편한 것들이 모두 해결되고 높은 확장성을 가진 시스템을 구축할 수 있는 것 같지만 현실은 그렇지 못하다. 대부분의 서비스들은 NoSQL을 제대로 사용하지 못하고 있다.

mysql_nosql_google_search

대부분의 서비스는 RDBMS를 주요 저장소로 사용한다.

아직까지는 구글을 제외한 대부분의 다른 서비스들은 NoSQL을 제대로 사용하고 있지 못하다. 거의 대부분의 기업들은 주요 저장소로 RDBMS를 사용하고 있는 것이다. 대표적으로 몇 가지 사례를 들어보면 다음과 같다.

페이스북은 MySQL을 사용한다.

2012년 3월 기준으로, 페이스북의 MAU는 9억명[4]을 넘었다. 이 정도의 추세라면 2012년 중순에는 10억명을 돌파할 것이라고 한다. 이렇게 엄청난 수의 사용자 트래픽을 감당하기 위해서는 아주 특별한 방법을 통해 데이터를 저장해야 될 것 같지만, 실제로는 MySQL을 사용하여 저장 및 관리[5]한다. 심지어 최근에 적용된 기능인 타임라인도 MySQL을 사용하여 구현[6]되었다. 앞서 언급된 메세징 시스템이나 실시간 분석 시스템 등의 정도만 NoSQL을 이용하여 구현되었고, 대부분은 여전히 RDBMS를 쓰고 있는 것이다.

  • MySQL을 여러개의 논리적 DB와 여러 대의 물리적 서버에 나누어 운영된다. (Sharding)
  • 데이터는 Key-Value 형태로 최대한 단순하게 저장된다.
  • 각 데이터의 조인 연산은 Web Server에서 담당한다.

트위터도 MySQL을 사용한다.

트위터의 경우, 많이 들어오는 경우 초당 수 천건의 트윗이 들어온다.[7] 올해 초의 슈퍼볼 결승전 때는 초당 트윗이 만건을 넘기기도 하였다.[8] 이렇게 엄청난 양의 트래픽을 처리하는 트위터 또한 주요 저장소로 MySQL을 사용한다. 사실 처음에는 Cassandra로 바꾸려고 했었지만[9] 결국엔 MySQL 시스템을 유지하기로 결정하였다.[10] 트위터는 Gizzard를 통해 데이터 레이어를 추상화 하여 MySQL에 데이터를 저장한다.[11] 이렇게 엄청난 수의 트윗에 대한 아이디를 발급하기 위해 Snowflake를 사용[12]한다.

  • MySQL을 여러개의 논리적 DB와 여러 대의 물리적 서버에 나누어 운영된다. (Sharding)
  • Gizzard를 이용하여 데이터의 Sharding과 Replication을 추상화한다.

Tumblr도 아직은 MySQL가 주요 저장소다.

Tumblr는 엄격하게 말하면 블로깅 서비스이지만, 체류시간이 페이스북 다음으로 두번째로 긴 소셜 서비스로 소개된다. (물론 페이스북이 압도적으로 크다) Tumblr에서도 실제 데이터는 MySQL을 사용하여 저장하며, 제한적으로 NoSQL을 사용[13]한다.

  • MySQL에 데이터를 잘 쪼개 저장한다. (Sharding)
  • HBase같은 것들은 URL Shorter나 데이터 분석 등 제한적으로 사용되었다.
  • 시간 순서대로 쪼개진 데이터 덕분에 특정 MySQL Shard에 로드가 집중되는건 Master-Slave구성으로 해결하였다.

Pinterest도 MySQL을 주요 저장소로 사용한다.

Pinterest는 특정 주제로 사진을 게시 및 공유 할 수 있는 서비스로, 단기간에 사용자 3000만명을 넘기며, 그것도 80%이상이 여성 사용자를 확보하면서 큰 주목을 받고 있다. Pinterest는 데이터 분석을 위해 Hadoop을 이용[14] 하긴 하지만, 실제 데이터는 MySQL에 저장[15]한다.

  • MySQL을 이용해 데이터를 저장한다.
  • 다양한 방법으로 데이터를 캐싱한다.

인스타그램도 PostgreSQL을 사용한다.

인스타그램은 1500만명 이상이 사용하는 사진 공유 서비스이다. 그리고 페이스북에 인수되기도 하였다. 인스타그램에서는 RDBMS중 하나인 PostgreSQL을 사용[16]한다. 그리고

  • 3명의 엔지니어가 초기 개발에 참여했다.
  • 12개의 EC2 인스턴스를 이용하여 PostgreSQL을 돌린다.
  • PostgreSQL 인스턴스들은 오픈소스를 이용해 Master-Replica 형태로 운영된다.
  • 시스템은 그 외 여러가지 오픈 소스를 이용하여 구성되어 있다.

에버노트도 MySQL을 사용한다.

에버노트는 클라우드 노트 서비스이다. 2011년 한해동안 600만명에서 2000만명으로 유저가 증가할 정도로 엄청난 속도로 성장하고 있는 서비스이며[17] 수 많은 노트들을 다양한 채널을 통해 관리할 수 있는 환경을 제공한다. 에버노트는 MySQL을 저장소로 사용하며, NoSQL이 아니라 SQL기반의 RDBMS를 사용하는 이유에 대해서도 블로그[18]에 올라왔었다.

  • MySQL을 사용한다. [Sharding]
  • RDBMS를 사용하는 이유는 ACID 때문이다.

이처럼 대규모 트렌젝션을 처리해야하는 서비스도 주요 저장소로 아직은 RDBMS를 사용한다. 페이스북의 메신저 시스템과 실시간 분석 시스템, 텀블러의 주소 길이 단축 시스템 정도만 HBase와 같은 NoSQL을 실험적으로 도입하는 단계이다. NoSQL을 전면적으로 도입하려다 그만 둔 트위터도 있고 심지어 처음부터 잘되어있는걸 가져다 쓰라는 Instagram도 있다. 에버노트는 NoSQL을 쓰지 않는 이유를 명확히 밝혔다. Scalability가 가장 중요한 이슈일 것 같은 많은 서비스들이 아직도 NoSQL을 사용하지 않는 이유는 자명하다.

NoSQL 기술은 아직은 걸음마 단계이다.

오픈소스로 공개되어 있는 NoSQL은 굉장히 많다.[19] 많은 기업들이 NoSQL을 도입하기 위해 여러가지 시도들을 하고 있다. 하지만 아직까지 주요 데이터 저장소로 RDBMS를 사용하는 경우가 거의 대부분인 것이 현실이다. 왜 그럴까? 많은 이유가 있을 수 있겠지만, 그 중 중요한 하나는 배포 중인 NoSQL들이 범용적으로 사용하기에는 아직 부족한점이 너무도 많다는 것이다.

서비스를 구현하는데 반드시 필요한 것들이 있다. 바로 Index와 Transaction이다. 이것들 없이도 어떻게든 잘 구현할 수 있는 특수목적의 시스템을 제외하면 이런 기능들은 제대로된 서비스를 만들기 위해서 반드시 필요하다. 이런 기능들이 제공되지 않으면 범용적인 사용이 불가능하며, 충분히 추상화되지 못한 상태에서 Concrete한 문제를 해결하기 위해 쓸데없는 시간을 보낼 것이다. 현재 배포되어 있는 NoSQL들은 이와 같은 기능이 아예 없거나 제한적이다. Transaction의 경우 NoSQL상에서 분산 트렌젝션을 구현하기 위한 Transaction을 구현하기 위한 시도 들이 있었다. 그것들이 바로 Elastras[20]와 CloudTPS[21]이다. 하지만 Eventually Constsitancy의 한계를 보여주며 완벽하게 망했다.

사실 HBase에는 TransactionalTable[22] 같은 트렌젝션을 제공하기 위한 API가 존재하기는 한다. 하지만 글쎄, 2011년 초에 사용하려고 써봤지만, 그닥 제대로 동작하는 것 같진 않았다.

baby

단, 구글을 제외하고

Transaction과 관련하여 구글이 2010년에 논문을 내놓았다. Percolator[23]인데 BigTable구조의 스토어에서 분산트렌젝션을 구현하는 방법에 대해 기술해 놓았다. 아주 깔끔 명료하고 완벽하게 동작한다. 이미 구글에서 사용하는 시스템이다. 어떤 대학의 연구실에선 자기들이 독자적으로 개발한 분산트렌젝션 방법이 살짝 부족하긴 해도 알고봤더니 구글의 Percolator와 비슷한 방법이라고 자랑질[24]을 할 정도이니 더 이상 언급하지 않아도 될 것 같다. 그리고 이미 구글의 클라우드 서비스인 AppEngine에서는 BigTable을 기본 데이터 저장소로 사용할 수 있도록 해주며, Indexing과 Transaction을 완벽하게 제공한다. 너무 비싸긴 하지만.

결론

거의 대부분의 서비스에서는 NoSQL을 사용하지 않는다. 그리고 그 이유는 트렌젝션과 같은 일반적인 서비스 구현에 필요한 기능들이 전혀 준비되어 있지 않기 때문이다. 하지만 구글의 경우 모든 것을 해결한 시스템을 BigTable상에 구현했으며 이미 몇 년동안 서비스하고 있다. 내리고 싶은 결론은 두 가지다.

  • 구글을 찬양하자.
  • 바퀴를 만들지 말자.

서비스를 구현하는데 주된 데이터 저장소로 NoSQL 사용을 고려하고 있다면, 구글을 제외한 다른 업체에서 일반적인 서비스를 구현하는데 있어서 NoSQL을 주된 저장소로 사용하고 있지 않다는 사실을 알고 결정하자. 사실 현재 일하고 있는 VCNC에서 Between이라는 서비스를 돌리고 있는데, 주저장소로 HBase를 쓰고 있기는 하다.

[1] http://techblog.netflix.com/2011/01/nosql-at-netflix.html
[2] https://www.facebook.com/note.php?note_id=454991608919
[3] http://borthakur.com/ftp/RealtimeHadoopSigmod2011.pdf
[4] http://newsroom.fb.com/content/default.aspx?NewsAreaId=22
[5] http://www.infoq.com/presentations/Facebook-Software-Stack
[6] https://www.facebook.com/notes/facebook-engineering/building-timeline-scaling-up-to-hold-your-life-story/10150468255628920
[7] http://yearinreview.twitter.com/en/tps.html
[8] http://blog.twitter.com/2012/02/post-bowl-twitter-analysis.html
[9] http://nosql.mypopescu.com/post/407159447/cassandra-twitter-an-interview-with-ryan-king
[10] http://engineering.twitter.com/2010/07/cassandra-at-twitter-today.html
[11] http://highscalability.com/blog/2011/12/19/how-twitter-stores-250-million-tweets-a-day-using-mysql.html
[12] http://engineering.twitter.com/2010/06/announcing-snowflake.html
[13] http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.html
[14] http://highscalability.com/blog/2012/5/21/pinterest-architecture-update-18-million-visitors-10x-growth.html
[15] http://highscalability.com/blog/2012/2/16/a-short-on-the-pinterest-stack-for-handling-3-million-users.html
[16] http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances-dozens-of
[17] http://gigaom.com/2011/12/27/evernote-2011-growth-users/
[18] http://blog.evernote.com/tech/2012/02/23/whysql/
[19] http://nosql-database.org
[20] http://www.usenix.org/event/hotcloud09/tech/full_papers/das.pdf
[21] http://www.globule.org/publi/CSTWAC_tsc2011.html
[22] http://archive.apache.org/dist/hadoop/hbase/hbase-0.20.1/docs/api/org/apache/hadoop/hbase/client/transactional/TransactionalTable.html
[23] http://research.google.com/pubs/pub36726.html
[24] http://www.math.uwaterloo.ca/~hdesterc/websiteW/Data/presentations/pres2010/NIISI.pptx.pdf

저작자 표시 비영리 변경 금지
신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소

Tag NoSQL

태국에 게임 서버 서비스를 하려고 이것 저것 테스트 하던 도중

이상하게 쿼리를 한번에 3만개 정도 실행 시키면, 데드락 걸리면서 쿼리가 제대로 실행이 안되는 경우가 발생했습니다.

 

처음엔 이게 시간과 관련된 쿼리라 태국의 로컬시간대랑 뭔가 연관이 있지 않을까 이것 저것 보던중

태국에서 셋팅한 윈도우 설정에 문제가 있다는걸 확인했습니다.

 

CPU가 Xeon X5675 @ 3.07Ghz 에다가 16GB 렘이 있는 시스템인데

윈도우 2003 (32bit)를 설치해서 메모리를 제대로 소화를 못하는거 같더군요.

 

그런 고로, 메모리를 설정하는 것을 구글에서 찾아내서 적용시켜 보니 쌩쌩 날아다니는 DB....

ㅁㄴㅀㄴㅏㅣㅓㅈㅎㅁ5!@$

 

어쨋든.... 메모리 설정에 대해선

http://toe10.tistory.com/63 을 참고해서 셋팅했습니다.

 

혹시 모를 폭파 위험에 여기서 제가 한 셋팅 순서도 올려 놓겠습니다.

 

1. MSSQL에서 AWE(Address Windowing Extensions)을 설정해야 합니다만,

32bit 운영체제 이므로 그전에 Lock page in memory 권한을 얻어와야 합니다.

 

시작 -> 프로그램 -> 관리도구 -> 서비스에서

SQL Server Agent(MSSQLSERVER)의 사용자 명을 확인합니다.

 

 

 

2. 시작 -> 실행 -> gpedit.msc 를 실행한뒤 아래 그림처럼

Lock pages in memory 권한을 1과 같은 사용자에게 줍니다.

 

3. 서버 설정 탭에 들어와서 AWE 사용을 체크하고

최대 서버 메모리를 설정합니다 (단위는 MB)

 

4. 네트워크 속성에서 네트워크 응용 프로그램을 취해 데이터 처리량 최대화를 선택합니다.

...

문제는 "Microsoft SQL Server 2005 포켓 컨설턴트 관리자용"이란 책에선 이 옵션을 피하라고 기술 되어있습니다만..

 

음....

 

 

저작자 표시 비영리 변경 금지
신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소

Tag MS-SQL

특정 테이블의 레코드들만 따로 백업할때 쓰는 방법 입니다. 

 

(보안상 중요한 텍스트는 다 삭제)

 

command 에 들어가서

백업

$> bcp [db명].dbo.[백업할 테이블명] out [백업 파일명] -c /U[db의 유저명] /P[db의 암호]

 

복구

$> bcp [db명].dbo.[백업할 테이블명] in [백업 파일명] -c /U[db의 유저명] /P[db의 암호] 

 

 

저작자 표시 비영리 변경 금지
신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소

Tag MS-SQL