SQL 34

Redis #3

이번 포스트에서는 Redis에서 사용가능한 여러 자료구조들을 배워보겠습니다. 1) Set - 중복을 허용하지 않는 자료구조sadd - Set에 데이터 추가 : sadd [set이름] [value]sinter - Set 조회 : sinter [set이름]srem - Set에서 데이터 삭제 : srem [set이름] [value] 2) 정렬된 Set - 또는 C++의 Mapzadd - 정렬된 Set에 데이터 추가 : zadd [set이름] [key] [value]zrange - 정렬된 Set 조회 : zrange [set이름] [범위시작] [범위끝] (범위끝이 -1인 경우 전체를 보여줌)zrerange - 역순으로 정렬된 Set 조회 3) 리스트 - 또는 배열lpush - 헤드에 데이터 추가 : lpush ..

Redis #2

이번 포스트에서는 Redis에서 사용가능한 명령어를 간단하게 알아보고이를 어떻게 활용할 수 있는지도 생각해보겠습니다. 1) 자료형에 관계없이 사용1 - 1) Key - Value 쌍의 데이터 만들기set [key] [value]get [key] 위의 set과 get 함수를 이용하여 Redis에서 기본적으로 사용하는 데이터 구조인Key - Value 쌍을 만들고 Value를 가져올 수 있습니다. 1 - 2) 여러개의 Key - Value 쌍의 데이터 만들기mset [key1] [value1] [key2] [value2] ...mget [key1] [key2] ... mset과 mget을 이용하여 한번에 여러개의 Key - Value 쌍을 만들 수 있습니다. 1 - 3) 자료형간의 오버라이드Redis에서는 ..

Redis #1

이번 포스트에서는 NoSQL의 방식으로 동작하는 Redis에 대해 간단하게 알아보겠습니다. 1) NoSQL이란?지금까지 사용한 MSSQL은 RDBMS 즉, 관계형 데이터베이스입니다.그리고 이번에 알아볼 Redis와 같은 NoSQL은 관계형 데이터베이스가 아닌 경우를 일컫습니다. RDBMS뿐만이 아니라 NoSQL까지 사용하는 이유는 RDBMS에서 데이터의 양이 많아질수록 처리하는 속도가 매우 느려지기 때문입니다.이로 인해 보조적으로 NoSQL을 사용하거나 NoSQL을 중점적으로 사용하여 작업하게 됩니다. 이런 NoSQL의 종류는 매우 많은데,Redis의 경우 NoSQL 중에서 데이터를 Key-Value 쌍으로 처리하는 DBMS입니다. 2) RedisRedis는 데이터를 메모리에 저장하는 방식을 사용합니다...

SQL (31) - 트랜잭션

이번 포스트에서는 트랜잭션의 동작 원리와 동작 구성을 살펴보겠습니다. 1) 트랜잭션트랜잭션은 하나의 작업 단위를 의미합니다.그리고 이러한 트랜잭션은 ACID라는 특성을 갖고 있습니다. A : Atomicity(원자성), 데이터의 유효성을 보장C : Consistency(일관성), 데이터는 미리 정해진 규칙에서만 수정이 가능함I : Isolation(고립성), 하나의 트랜잭션에 다른 트랜잭션이 개입하지 못하며, 영향과 간섭받지 않음D : Durability(지속성), 한번 COMMIT된 데이터는 안정적으로 보존되며 남겨진 로그를 통해 수정 가능 2) 로그위와 같은 트랜잭션의 ACID 특성 중에서 Durability와 관련된 로그에 대해서 알아보겠습니다.DB에서는 항상 어떤 행동을 취한 후 로그를 남기게 됩..

SQL (30) - 대기와 락

이전의 포스트에서 SQL에서도 마찬가지로 멀티 스레드 방식을 사용하는 것을 알아보았습니다.따라서 LOCK을 사용하여 멀티 스레드의 위험성을 최대한 낮추는 것 역시 동일하게 적용됩니다.그러므로 오늘은 SQL에서의 대기와 락이 어떻게 구성되어 있고 어떻게 이뤄지는지 알아보겠습니다. 1) Lock의 종류1 - 1) 상호배타적인 Lock일반적인 Lock인 상호배타적인 Lock은하나의 스레드가 자원을 점유하는 동안 다른 스레드들의 접근을 완전히 막습니다. 그러나 상호배타적인 Lock은 자원에 대한 원자성을 보장할 수는 있지만,모든 작업에 대해 원자성을 보장하게 되어 원자성이 필요없는 작업의 속도도 늦춘다는 단점이 있습니다. 1 - 2) Reader - Writer Lock위의 상호배타적인 Lock의 단점에 대응하..

SQL (29) - 쓰레드와 캐싱

이번 포스트에서는 DB를 다루는데 있어서 쓰레드와 캐시가 무슨 역할을 수행하는지 알아보겠습니다. 1) READ와 WRITE로 알아본 DB의 스레드1 - 1) READDB로부터 데이터를 가져오는 READ의 경우 다음의 과정을 거쳐 동작합니다.데이터 사용자로부터 SQL 쿼리(SELECT)를 받음DB 관리자가 해당 SQL 쿼리를 파싱파싱된 결과를 바탕으로 DB로부터 데이터를 읽음DB 관리자가 데이터 사용자에게 결과를 전달 1 - 2) WRITEDB에 데이터를 쓰거나 수정하는 WRITE의 경우 다음의 과정을 거쳐 동작합니다.데이터 사용자로부터 SQL 쿼리(INSERT)를 받음DB 관리자가 해당 SQL 쿼리를 파싱파싱된 결과를 바탕으로 DB에 데이터를 씀DB 관리자가 데이터 사용자에게 결과를 전달 위와 같이 Re..

SQL (28) - 데이터 베이스의 원리

이번 포스트에서는 Data Base가 동작하는 원리를 알아보고 관련된 추가 정보도 알아보도록 하겠습니다. 1) DataBase가 취해야 하는 궁극적인 목표DB가 취해야 하는 궁극적인 목표를 정리하면 다음과 같습니다.스레드가 DB에 저장된 많은 데이터를 병렬로 처리할 수 있어야 함클라이언트의 요청으로부터 스레드가 DB의 데이터에 대해 빠르게 작업하여 응답할 수 있어야 함DB에서는 COMMIT된 데이터를 안전하게 저장해야 함위의 3가지 목표는 DB가 추구하는 이상적인 목표지만,위의 목표를 이뤄내는 과정에서 서로에게 악영향을 끼칠 수 있습니다. 2) DB는 어디에 저장하는가?DB의 목표중에서 3번째인 저장하는 부분에 주목하여 몇가지 정보를 알아보겠습니다. 2 - 1) 하드 드라이브DB는 하드 드라이브에 저장할..

SQL (27) - 정렬

이번 포스트에서는 DB에서의 정렬이 일어나는 경우를 알아보겠습니다. 1) 정렬이란?일반적인 정렬로서 동작하는 Quick Sort의 경우, NLogN의 시간복잡도를 갖습니다.그러나 데이터의 양이 매우 많은 데이터 베이스에서는 위의 시간복잡도도 매우 위험합니다. 또 데이터 베이스에서는 기본적으로 수천, 수만가지의 데이터를 담고 있게 됩니다.따라서 메모리만으로는 정렬에 한계가 있기에 디스크까지 가져와 정렬에 사용할 수도 있는데,이런 경우 이동 비용 역시 고스란히 부담하게 됩니다. 따라서 MSSQL에서 정렬이 일어나는 경우와, 이를 대비하는 방법을 알아보겠습니다. 2) 정렬을 수행하는 경우정렬이 수행되는 경우를 다음과 같이 간단하게 정리해보았습니다.1) Merge JOIN2) ORDER BY3) GROUP BY..

SQL (26) - Hash JOIN

이번 포스트에서는 JOIN의 3가지 방식 중에서 마지막 방식인 Hash JOIN에 대해 알아보겠습니다. 1) Hash JOIN 예제SELECT *FROM TestOrders AS o INNER JOIN TestCustomers AS c ON o.CustomerID = c.CustomerID; 실행 결과를 확인해보면 다음과 같습니다.위의 쿼리는 실행하게 되면 Hash JOIN으로 동작하게 됩니다.로직을 바꿔 Nested Loop JOIN이나 Merge JOIN을 실행하는 경우도 확인해보겠습니다.SELECT *FROM TestOrders AS o INNER JOIN TestCustomers AS c ON o.CustomerID = c.CustomerID OPTION (FORCE ORDER, LOOP JOIN..

SQL (25) - Merge JOIN

이번 포스트에서는 SQL에서 JOIN을 수행하는 3가지 방법 중에서 Merge JOIN에 대해 알아보겠습니다.Merge JOIN은 병합 JOIN으로 부르지만,내부적으로 정렬과정도 거치게 되므로 Sort-Merge JOIN으로 부르기도 합니다. 1) Merge JOINMerge JOIN은 다음의 과정을 거쳐 수행됩니다. 우선, Sort를 수행(이미 정렬된 상태라면  SKIP), 최종적으로 O(n * logn)의 시간복잡도다음으로 Merge를 수행하는데, Outer(FROM의 인자)의 상태에 따라 다르게 수행됨One-to-Many : Outer에 중복이 없는 경우Outer의 데이터 개수를 a, Inner의 데이터 개수를 b라고 표현한다면a * O(a + b)의 시간복잡도를 갖게 됨Many-to-Many : ..