mybatis로 DB조회하는 환경에서 업무성격에 따라 대용량을 조회하는 경우 수십초가 걸리는 경우가 있습니다. 이때 같은 쿼리를 툴에서 돌려보면 1초 정도로 아주 빠르게 조회되는 경우가 있는데 어떻게 해결할 수 있을까요? 바로 코드부터 보게된다면 아래와 같습니다. select * from board fetchSize는 보통 설정하지 않는 옵션인데 그렇게 될 경우 기본값은 10 입니다. 즉, 조회할 데이터가 1000개라면 100번을 조회하게 됩니다. 하지만 1000으로 설정할 경우 1번만 조회하게 되는것이지요. 어떤 사용자가 성능테스트를 한적이 있는데 109k의 데이터를 조회하는데 1분 40초가 소요 되었지만 fetchSize를 설정하면 아래와 같이 소요되었다고 합니다. fetchSize=75 -> 15초..
소량의 데이터를 칠 경우 그냥 UPDATE를 하면 되겠지만 데이터가 1만, 10만건이 되었을 경우 한 트랜젝션에 그 많은 작업을 물리기엔 시간이 너무 오래 소요된다. 그래서 이렇게 대량의 데이터를 UPDATE할 경우 100건이나 1000건씩 나눠서 트랜잭션을 쪼개는게 더 효율적이다. 이 방법은 프로시저를 이용하여 while문을 쓸 것이다. DECLARE @WHERE_STR VARCHAR(1000); SELECT @WHERE_STR = SELECT_NAME FROM A WHERE FORM_TYPE = 'TEST' WHILE 1=1 BEGIN UPDATE TOP(1000) TARGET_TABLE SET SELECT_CD = 'CHANGE TXT ' WHERE SELECT_CD = @WHERE_STR IF @..
SP(Stored Procedure)란? 스토어드 프로시저란 DB 내부에 저장된 일련의 SQL 명령문들을 하나의 함수처럼 실행하기 위한 쿼리의 집합 스토어드 프로시져는 뷰와 같이 SQL문 덩어리로 되어 있고 비슷하지만 활용도는 차이가 있다. 우선 매개변수의 사용으로 사용자에게서 변수값을 받을 수도 있고 또 그 값을 output으로 밖으로 되돌려줄수도 있다. 또한 일반적인 쿼리와는 좀 다른 처리 방식을 가진다. 프로시져 생성과 반복 1) 만들 때 1. 구문분석(Parsing) : 키워드를 분리하고 문법검사를 한다. 2. 표준화 : 각 object의 이름을 확인한다. 3. 보안점검 : 저장 프로시져를 만들 수 있는 권한이 있는지 검사한다. 4. 결과는 syscomments와 sysobjects에 저장한다. ..
ms-sql에는 재귀함수와 같은 역할을 하는 문법이 존재한다. 이는 단순 쿼리에서 파생되며 단일 select, insert, update, delete 또는 merge문 실행 범위 내에서 정의됨 CTE는 비재귀적 CTE와 재귀적 CTE로 구분 할 수 있습니다. 재귀적이라는 의미는 자기 자신을 반복적으로 호출하는 것을 의미합니다. (BOM, 부서계층그룹에 해당) 비재귀적은 단순한 형태의 쿼리를 얘기하며, 복잡한 쿼리 문장을 단순화 시키는데 적합하게 사용될 수 있습니다. 기본 문법 ;WITH CTE_테이블이름(열이름) AS ( ) SELECT 열이름 FROM CTE_테이블이름; WITH 키워드 다음에는 CTE의 이름을 지정하고 그 다음에는 선택적인 열 별칭 목록을 지정합니다. 열 별칭은 CTE 내의 sele..
Temp Table 임시테이블은 말 그대로 tempdb에 임시적으로 만들어지는 table로서 특징에 따라 지역임시테이블과 전역임시테이블로 나눌 수 있습니다. 지역임시테이블은 table이 생성되는 session이 끝나면 자동으로 삭제됩니다. 하지만 보통 임시로 사용하려고 잠깐 생성하는 것 이기에 지역 임시 테이블로 많이 사용하고 지웁니다. 임시테이블을 생성하려면 table 생성시 이름 앞에 #을 추가함으로써 이 테이블이 임시테이블임을 알립니다. #이 하나면 지역임시테이블 ##이면 전역임시테이블이 됩니다. SELECT A.CUSTOMER_ID, A.CUSTOMER_NAME, B.SEQ_NO, B.AMOUNT INTO #TEMP FROM CUSTOMER A JOIN SALE_DATA B ON A.CUSTOME..
문제. 1. [order]라는 주문 테이블에서 2번이상 주문된 메뉴와 그 메뉴의 타입을 제외해라 2. 제외된 음식들 빼고 나머지 음식들의 주문 갯수를 출력. --select절에서 count하기 select menuno, name, (select count(*) from [order] where menuno = s.MENUNO) as '주문 개수' from ordersheet s where type not in (select type from ordersheet where menuno in (select menuno from [order] group by MENUNO having count(*)>1)) ; 설명 : 1. [order]에서 menuNo로 group by해서 주문된 수가 1보다 큰 메뉴번호를 ..
select로 insert 하기 1. insert into 삽입될 테이블(컬럼 나열1, 컬럼 나열2 ...) select (컬럼 나열1, 컬럼 나열2 ...) from 참고할 테이블 where 조건(조건은 없어도 됨) 위와 같이 select문으로 검색된 데이터를 첫 번째 줄에 있는 테이블에 해당 컬럼으로 넣는다. 그리고 insert into방식에서 삽입될 테이블은 반드시 미리 생성하고 사용해야 한다. INSERT INTO BACKUPROWDATA(EMPNO, NAME, MENUNO, MENUNAME, ORDERDATE, BACKUPDATE) SELECT B.EMPNO, B.NAME, C.MENUNO, C.MENUNAME, A.ORDERDATE, GETDATE() AS BACKUPDATE FROM [Ord..
보통 오라클에 날짜를 입력할 때 sysdate를 많이 사용한다. 근데 국제표준시간이 영국으로 잡혀 있는 경우에데이터 파싱하는일이 진짜 여간 번거로운일이 아니다. 여러가지 방법이 있지만 그 중에서 sysdate에서 시간을 더해서 가져오는 방식, 혹은 이를 이용해 데이터를 더한채로 넣는 방법을 구할 것이다. 먼저 사용법은 가져올 때 더한채로 가져오는 방법을 할 것이다. SELECT TO_CHAR(SYSDATE, 'YYYYMMDD HH24MISS') C_TIME, -- 현재시간 TO_CHAR(SYSDATE + 1/24,'YYYYMMDD HH24MISS') TIME, -- 1시간 후 TO_CHAR(SYSDATE + 40/(24*60),'YYYYMMDD HH24MISS') MIN, -- 40분 후 TO_CHAR(..