본문 바로가기

SQL7

MyBatis 샾(#) 달러($) 차이 select * from TestTablewhere testId = #{testId} MyBatis에서 위와 같은 쿼리문을 실행하게 되면 database에서는 아래 쿼리문에 대한 의미, 구문 분석 및 파싱 작업을 진행하게 된다. select * from TestTablewhere testId = ? 만약 testId에 1 값이 바인드 되게 되면 database에서는 이미 파싱되어 있는 쿼리문을 재활용하게 되기에 위의 작업들을 줄일 수 있다.단, 데이터베이스 옵티마이저에 대한 수행 계획은 항상 동일하다라는 것이 단점이다.수행 계획에 따른 데이터 추출은 데이터의 분포도에 영향을 받게 되는데 만약 1 이라는 값이 TestTable에 4개 존재하고, 2 라는 값이 1000개 존재한다고 했을 때1을 추출할 때에는.. 2016. 1. 21.
mybatis multiple select key selectKey 조회 시 한 건만 가능했던 것이 MyBatis 3.2.6 버전부터는 multiple select key 가 지원되었다.모르고 있었던 기능인데 회사 동료로부터 알게 되었다.Provides some new features: - Caches nested selects - Lazy loading can be enabled only for specific relations - Supports returning multiple fields in a select key - Some other minor improvements http://blog.mybatis.org/2014/03/mybatis-326-released.html 아래와 같이 쿼리를 만들고 테스트를 해보니 잘 동작한다. 실제 업무에서 .. 2015. 5. 21.
카티션곱을 이용한 데이터 추출 방법 테이블 a sp_key 111 222 333 테이블 b id sp_key test1 111 test1 222 test1 333 test2 111 test2 222 결과 id sp_key test2 333 테이블 a의 3개 sp_key 컬럼 데이터를 기준으로 테이블 b의 각 id에 sp_key데이터가 없는 것을 추출하는 방법에 대해서 설명한다.대개 쿼리를 작성할 때 inner join이나 outer join을 많이 사용하지만 위와 같이 두 개의 테이블 집합에서 공통으로 존재하는 데이터를 뽑아내는 것이 아닌 없는 데이터를 뽑을 때에는 어려움을 많이 느낀다. 위의 문제를 해결할 수 있는 방법이 몇 가지 있는데 그 중 첫 번째 방법은 카티션 곱을 이용하여 데이터를 복제한 후 결과 값을 추출하는 방법이다.SELE.. 2013. 5. 6.
mysql 프로시저 loop를 이용하여 테스트 데이터 insert 간혹 테스트를 위해 수백만 건의 데이터를 테이블에 넣어줄 일이 생긴다.그럴때 다음의 프로시저 샘플을 이용하여 데이터를 밀어 넣자. DELIMITER $$DROP PROCEDURE IF EXISTS FILL_RATE_TEST_DATA$$CREATE PROCEDURE FILL_RATE_TEST_DATA()BEGINDECLARE i INT DEFAULT 1;DECLARE log_date VARCHAR(255);WHILE i 2013. 2. 19.
db connection pool 어떤 걸 쓸까? 현재 프로젝트에서는 commons dbcp pool과 tomcat jdbc pool을 사용하고 있다. 몇일 전에 스터디 그룹에서 나왔던 얘기가 apache commons dbcp는 하드웨어 멀티 코어를 제대로 활용하지 못해서 성능이 떨어지고, 소스 버전 업데이트는 거의 이뤄지지 않는다고 한다.몇 가지 더 알아보니 commons dbcp는 하나의 쓰레드를 사용하기 때문에 멀티쓰레드 안전성을 보장하고자 전체 connection pool에 대한 lock을 건다고 한다. dbcp의 단점에 비해서 tomcat jdbc pool은 하드웨어의 멀티 코어를 충분히 활용하고 성능이 좋다고 한다.성능이 좋다는 기준이 dbcp보다 좋은 건지 다른 컨넥션 풀링보다 좋다는 건지는 모르겠지만 어느 정도의 안전성을 보장한다는 의미.. 2012. 12. 13.
날짜함수 쿼리 작성을 거의 안하다보니 함수고 조인이고 분석함수고 다 까먹게 생겼다. 아무래도 내 티스토리에 저장하여 간간히 보도록 해야겠당..ㅠㅠ -- 더하고 뺄때 날짜가 더해지거나 빼진다. select sysdate, sysdate + 1, sysdate - 1 from temp where emp_name = '홍길동' -- 시, 분, 초 등을 더함. select to_char(birth_date, 'HH24:MI:SS') birth_time, to_char(birth_date + 14/24, 'HH24:MI:SS') as time, to_char(birth_date + 30/(24*60), 'HH24:MI:SS') as min, to_char(birth_date + 50/(24*60*60), 'HH24:MI:.. 2009. 2. 21.
오라클 잠금 기능 비관적 잠금 - 해당 행에 잠금을 하여 다른 세션들로부터의 갱신을 막음 - 그 행이 변경되지 않고 남아 있을지 확신할 수 없기 때문에 갱신을 시도하기 전에 그 행에 잠금을 한다. SELECT EMPNO, ENAME, SAL FROM EMP WHERE EMPNO = :EMPNO AND ENAME = :ENAME AND SAL = :SAL FOR UPDATE NOWAIT 위의 쿼리문을 1번 세션에서 질의 실행 2번 세션에서 똑같은 쿼리문 실행하면 "ORA-00054: 자원이 사용중이고, NOWAIT가 지정되어 있습니다" 라고 오류가 나온다. 하지만 위의 쿼리문에서 FOR UPDATE NOWAIT문만 제거하고 실행하면 잠금을 설정한 해당 레코드의 검색이 이루어진다. 오라클에서는 행 잠금을 실행해도 다른 세션에.. 2009. 1. 2.