임시테이블을 쓰는 경우는 여러가지가 있겠지만,
다음 예제는 select시 in문 대신 temporary table을 사용하는 법이다.
만약 id가 1,2,3,4,5 인 것을 가져와야 한다고 하자.
쿼리는 이렇게 된다.
SELECT * FROM TABLE WHERE ID IN (1,2,3,4,5) |
만약 검색할 ID의 개수가 1,000개 이상이라면??...
방안중에 하나로 임시테이블을 쓸 수 있다.
IN문에 들어갈 번호들을 임시테이블에 쫙 넣고,
임시테이블과 테이블과 INNER JOIN을 하는것이다.
예제 ㄱㄱ
1. 임시테이블 생성
CREATE TEMPORARY TABLE IF NOT EXISTS TEMP_TABLE ( ID BIGINT(20) NOT NULL ) |
2. 임시테이블에 INSERT (일반 INSERT문과 똑.같.다)
INSERT INTO TEMP_TABLE (ID) VALUES (#{id}) |
3. SELECT 하기 (임시테이블과 이너조인)
임시테이블에 있는 아이디번호와 테이블에 있는 아이디가 같은 것을 뽑아내야하므로(교집합)
INNER JOIN이다.
SELECT COUNT(1) FROM TEMP_TABLE AS A ON A.ID = B.ID |
4. 테이블 값 삭제하기
세션 끝나면 테이블이 자동 DROP 되나,
세션 유지될 때 계속 테이블에 값이 누적될 수 있으므로, 수동으로 삭제해야할 경우 사용
DELETE도 일반 테이블과 사용법이 다름 없음
난 이것때매 값이 계속 누적됐었음 ㅋㅋㅋ
DELETE FROM TEMP_TABLE |
*** 주의할 점
- 클라이언트마다 각자 다른 임시테이블을 부여받아 사용한다.
- TEMPORARY TABLE은 임시테이블이 생성된 세션에서만 그 테이블을 사용 가능하다.
- 세션이 끝나면 테이블이 자동 삭제(DROP)된다.
세션 단위라는거!!!!!!!!
+ 추가
oracle은 in문의 개수를 1,000개로 제한한다고 하며,
mysql은
The number of values in the IN
list is only limited by the max_allowed_packet
value.
이라고 한다.
'개발 > Database' 카테고리의 다른 글
[iBatis/myBatis] #와 $의 차이점 (6) | 2013.04.11 |
---|---|
MySql] JOIN 속도를 빠르게! EXPLAIN, STRAIGHT_JOIN (3) | 2012.11.18 |
MyBatis] There is no getter for property named.. error (0) | 2012.09.07 |
MyBatis/iBatis] 방금 INSERT 된 Key 가져오기 (3) | 2012.09.05 |
MyBatis] 반복되는 쿼리 묶기 Sql , include 태그 (0) | 2012.09.05 |