반응형

MariaDB 5.2 버전 이후부터 VirtualColumn이라는 것을 지원한다는 것을 알게 되었고,

Oracle에서도 11g 버전 이후로 지원을 한다.

 

VirtualColumn이 하는 역할은, 테이블 하나에 있는 값들로 연산을 해야 하는데,

좀 반복적인 연산이다 싶은 경우에 VirtualColumn을 하나 두고, 표현식으로 계산식을 넣어두면,

Table에 Row가 쌓일때, 해당 표현식으로 계산이 되면서 VirtualColumn에 값이 들어가게 된다.

 

예를 들면,

a, b, c 컬럼이 있고, d컬럼을 a + 1이 들어가게 하고 싶다. 라고 한다면

d컬럼의 표현식에 a + 1을 넣어주고, 가상 컬럼임을 인지할 수 있게, VIRTUAL type으로 만들어준다.

본인처럼 로직 연산의 개념으로 사용하려면, 메모리를 직접적으로 사용하지 않는 VIRTUAL Type이 성능상 이점이 많다고 한다.

(sqlYog에서는 VIRTUAL type을 지정할 수 있는 UI가 없기 때문에, 본인처럼 CLI가 생소한 사람들은 HeidiSQL(http://www.heidisql.com/)을 사용하면 된다.)

 

기존에 있던 테이블을 고쳐서, Virtual Column을 하나 집어넣으려고 하니

Lock Timeout이라고 뜨면서 트랜잭션을 다시 시작하랜다..

데이터도 별로 없는 테이블인데 이렇게 뜨는걸 보면... 버그인가보다.

InnoDB lock timeout값을 아무리 늘려봐도 동일했다.

 

Virtual Column을 테이블에 두려면, 처음 구조부터 그렇게 잡고 가야하나보다.

 

참고로, user가 생성한 function은 표현식에서 지원을 하지 않는다.

또한, 안정성을 보장하기 위해(이건 그냥 주관적인 생각..), Virtual Column은 Nullable하게 설정이 된다.

 

기존 테이블을 Copy한 뒤, 만들고, 기존꺼 지우고, 새로 만든 테이블을 원래 테이블 이름으로 교체하니깐 잘 만들어졌다!

뭐.. 라이브 서비스 도중에 Virtual Column을 갑자기 넣는건 좀 말도 안되는 거고, 로직으로 처리하겠지...

개발단계니까 가능한일.. ㅋㅋ

 

퍼즐 게임을 만들고 있는데, 데이터가 1,2,3:4,5,2:3,3,2 이렇게 순차적으로 들어가게 되는데,

마지막 스테이지가 몇인지를 매번 코드에서 Split하다보니 짜증나기도 하고, 비효율적인 것 같기도하고 해서..

Virtual Column으로 만들어버리고, Getter를 이용해서 손쉽게 사용하고 있다.

 

마지막 스테이지를 구하려면 :가 몇개인지 카운팅하고 +1을 더해주면 되는 구조라서,

아래와 같은 표현식을 사용해서 구성했다.

SELECT LENGTH(@String) - LENGTH(REPLACE(@String, ':', '')) + 1

http://stackoverflow.com/questions/11835155/mysql-split-comma-separated-string-into-temp-table


String의 총 길이를 구해서, Delimiter를 빈값으로 치환하고 치환된 문자열의 길이를 재서 원래 문자열의 길이와 Substract를 하면...

Replace를 통해 치환된 문자열의 총 길이를 알 수 있는 로직이다.

생각도 못했던 로직인데... 사용자 정의 function 미지원 소식을 듣고, 포기하기 직전에 StackOverFlow가 구원의 손길을 내려줌 ㅎㅎ

 

VirtualColumn이라는 새로운걸 알았으니, 자주 써먹어보도록 하자.


※ memcached등 캐시용도로 사용할때는, 메모리상에서 위의 함수를 구현해서

캐시에서 가져온 후, 함수 실행을 해주는 식으로 해야한다. (이거 때문에 큰일날뻔...)

반응형
,