select A.id, A.pass, A.pstore_id, A.request, A.src_ip, A.dst_ip, A.src_port, A.dst_port, A.url,
A.dates, A.user_id, A.board_id, A.subject, A.body, A.exist_file, A.board_alert, A.recovery
from (
select
HTTP_LOG.id,
((pass)::bit(16) & (검색할 값)::bit(16))::int as pass,
pstore_id, request, src_ip, dst_ip, src_port, dst_port, url, dates, user_id, board_id,
subject, body, exist_file, board_alert, recovery
from
HTTP_LOG, FILTERING_BOARD
WHERE
HTTP_LOG.BOARD_ID = FILTERING_BOARD.ID
) A
WHERE A.pass != 0 |
<select id="getLogListByCondition" parameterClass="kr.co.privacycenter.beans.HttpLogCondition" resultMap="abatorgenerated_HttpLogResult">
select A.id, A.pass, A.pstore_id, A.request, A.src_ip, A.dst_ip, A.src_port, A.dst_port, A.url, A.dates, A.user_id,
A.board_id, A.subject, A.body, A.exist_file, A.board_alert, A.recovery
from
(select HTTP_LOG.id,
<isNotNull property="pass">
<![CDATA[((pass)::bit(16) & (#pass#)::bit(16))::int as ]]>
</isNotNull>
pass, pstore_id, request, src_ip, dst_ip, src_port, dst_port, url, dates, user_id,
board_id, subject, body, exist_file, board_alert, recovery
from HTTP_LOG, FILTERING_BOARD
WHERE HTTP_LOG.BOARD_ID = FILTERING_BOARD.ID
<isNotNull prepend="and" property="adminId">
FILTERING_BOARD.ADMIN_UID = #adminId#
</isNotNull>
) A
<dynamic prepend="WHERE">
<isNotNull prepend="and" property="boardId">
A.board_id = #boardId#
</isNotNull>
<isNotNull prepend="and" property="srcIp">
A.src_ip = #srcIp#
</isNotNull>
<isNotNull prepend="and" property="userId">
A.user_id like '%$userId$%'
</isNotNull>
<isNotNull prepend="and" property="subject">
A.subject like '%$subject$%'
</isNotNull>
<isNotNull prepend="and" property="existFile">
A.exist_file = #existFile#
</isNotNull>
<isNotNull prepend="and" property="startDate">
A.dates > #startDate#
</isNotNull>
<isNotNull prepend="and" property="endDate">
<![CDATA[ A.dates <= #endDate# ]]>
</isNotNull>
<isNotNull prepend="and" property="pass">
A.pass != 0
</isNotNull>
</dynamic>
</select> |
환경은 java 5.0, linux 2.6 kernel
postresql 8.1 과 ibatis입니다.
본래 abator가 만들어준 쿼리로는, 조인을 어떻게 해야할지 모르겠네요. (abator는 이클립스 플러그인). 그래서 생성해준 ibatis sql맵입니다.
먼저 아래의 ibatis sql맵을 간단히 보면, 기본 sql문에 검색 조건에 따라 조건문이 추가됩니다.
위 sql문은 pass라는 값이 존재할 때의 만들어진 문장입니다.
pass는 int값으로 0~65535 사이의 값이 들어있습니다.
다른 어플리케이션에서 1,2,4,8,... 32768 값들을 선택적으로 더해 DB에 넣어줍니다.
이걸 bit연산으로 추출해야하는데요.
예를 들어 DB에 저장된 pass 값은 258 입니다. (이것은 2와 256의 합이죠.)
이 데이터는 2로 검색해도 선택되어야하고, 256으로 검색해도 선택되어야 합니다. 또한 514 (512 + 2)로 검색되도 선택되어야합니다.
pass = 258 (0000000100000010)
& 검색값 = 2 (0000000000000010)
==================================
2 (0000000000000010) : 0 이 아니므로 선택
pass = 258 (0000000100000010)
& 검색값= 256 (0000000100000000)
==================================
256 (0000000100000000) : 0 이 아니므로 선택
pass = 258 (0000000100000010)
& 검색값= 514 (0000001000000010)
==================================
2 (0000000000000010) : 0 이 아니므로 선택
나름대로 열심히 설명했습니다.
java쪽은 수정할 수 있지만, DB 테이블은 변경하지 못합니다.
이 쿼리를 최적화 시킬 수 있을까요?
|