DP-MSQ 쿼리 최적화 가이드 쿼리 최적화 방법 2014년 7월
목차 개요 암호화 동작원리 VTI 모드 쿼리 최적화 방법 API 모드 쿼리 최적화 방법 최적화된 쿼리 검증 방법 주의사항 쿼리 최적화란? 암호화 적용 시 쿼리 최적화 대상 암호화 동작원리 VTI 모드 동작원리 암호화 적용 이후 객체 변화 API 모드 VTI 모드 쿼리 최적화 방법 API 모드 쿼리 최적화 방법 최적화된 쿼리 검증 방법 주의사항
개요 쿼리 최적화란? 암호화 적용 시 쿼리 최적화 대상
I. 개요 1. 쿼리 최적화란? 개요 - 쿼리 최적화란? D’Amo는 암호화 후에도 기존 쿼리를 동일하게 사용할 수 있는 기능을 제공하고 있습니다. 일부 쿼리의 경우 암호화 후 불필요한 암복호화로 인해 성능이 저하되거나, MSQcle 특성상 기존의 쿼리를 사용하기 어려운 경우들이 있습니다. 이러한 경우 쿼리를 적절하게 변경함으로써, 문제를 해결할 수 있으며, 이러한 과정을 “쿼리 최적화”라고 부릅니다. 암호화 후 변경 내역 view/trigger process 추가 일부 경우 execution plan 변경 쿼리 최적화 암호화 쿼리 최적화 필요성 성능 개선! 서버 부하 감소! View로 인한 쿼리 Syntax 제약 해결! DP-MSQ 쿼리 최적화 가이드
개요 - 암호화 적용 시 쿼리 최적화 대상 (1/2) 불필요한 암복호화 방지 View 제약 2. 암호화 적용 시 쿼리 최적화 대상 개요 - 암호화 적용 시 쿼리 최적화 대상 (1/2) 불필요한 암복호화 방지 실제 암호화 값에 대한 복호화 값이 query를 실행하는 도중 일시적으로만 사용되거나, 단순 비교만을 위해 사용되는 경 우에는 암호화 값을 직접 사용하여 복호화 과정을 줄이거나 생략할 수 있습니다. 대표적인 사례로는 다음과 같습니다. Sub Query에서 암호화 컬럼에 대한 참조가 대량으로 참조하는 경우 암호화 컬럼 간 조인 암호화 데이터 간의 복제 암호화 컬럼이 group/having 절에 있는 쿼리 View 제약 View는 일종의 가상의 테이블로 실제 테이블에 적용 가능한 Query의 경우 동일하게 사용할 수 있지만 아래와 같은 일 부 쿼리의 경우 MSQcle의 특성상 view에 적용하는 것이 불가능합니다. Syntax 에러 발생 Return rowid, merge into Partition을 명시한 query rowid를 이용한 쿼리 LOB 컬럼의 처리 DP-MSQ 쿼리 최적화 가이드
개요 - 암호화 적용 시 쿼리 최적화 대상 (2/2) Plan 변경 기존 Table에 적용되어 있던 Trigger DML 2. 암호화 적용 시 쿼리 최적화 대상 개요 - 암호화 적용 시 쿼리 최적화 대상 (2/2) Plan 변경 암호화 적용 후에는 기존 query들은 view를 이용하게 되고, 암호화 컬럼에 대한 인덱스가 변경되므로 execution plan이 변경될 수 있습니다. plan이 비효율적으로 변경되는 경우, view대신에 table을 직접 이용하도록 변경함으로써 plan을 개 선할 수 있습니다. 다음의 경우에는 암호화 후에 실행 계획이 비효율적으로 개선되는 사례들입니다. 암호화 컬럼을 이용한 조인 (outer 조인 포함) 복잡한 쿼리 (sub query+order+group가 포함된 경우) 전방위 검색 (%plain%) Hint 가 들어있는 쿼리 DB link와 연관 쿼리 기존 Table에 적용되어 있던 Trigger 기존 table에 적용되어 있던 trigger의 구문은 새로 추가된 view의 trigger의 영향으로 오동작하거나, 결과가 달라질 수 있습니다. 따라서 view 대신에 암호화 테이블을 참조하도록 수정하는 것이 바람직합니다. DML Insert/update 구문의 경우 암호화 후에는 view의 trigger를 이용하게 됩니다. 따라서 실행 시에 암호화 부하에 더불어 trigger사용에 따른 부하가 추가됩니다. 그러므로 trigger를 이용하지 않도록 수정함으로써 성능을 향상시킬 수 있다. DP-MSQ 쿼리 최적화 가이드
암호화 동작원리 VTI 모드 동작원리 암호화 적용 이후 객체 변화 API 모드
암호화 동작원리 – VTI 모드 DP-MSQ VTI 모드의 동작 원리 TRIGGER 암호화 전 암호화 후 II. 암호화 동작원리 1. VTI 모드 암호화 동작원리 – VTI 모드 DP-MSQ VTI 모드의 동작 원리 암호화 후 원본 테이블이 변경되기 때문에, 암호화 전 테이블과 동일한 형식을 가진 VIEW를 통해 사용자에게 정보를 보 여줍니다. 이때 VIEW를 통해 정보를 보여주기 위해 데이터 입력 조회 시 원본테이블과 VIEW사이에서 데이터 암복호화 가 이루어집니다. MEMBER (TABLE) MEMBER_DAMO (TABLE) (MODIFY) A B C JUMIN_NO 8104191024363 RENAME A B C SEC_JUMIN_NO 81041910321D2FCD121E35 복 호 화 암 호 화 기 존 접 근 경 로 A B C JUMIN_NO 8104191024363 암호화 후 접근 경로 MEMBER (VIEW) 사용자 TRIGGER 암호화 전 암호화 후 sIMEMBER, sUMEMBER, sDMEMBER (TRIGGER) DP-MSQ 쿼리 최적화 가이드
암호화 동작원리 – API 모드 DP-MSQ API 모드의 동작 원리 암호화 전 암호화 후 A B C JUMIN_NO II. 암호화 동작원리 2. API 모드 암호화 동작원리 – API 모드 DP-MSQ API 모드의 동작 원리 암호화 후 원본 테이블이 변경되지만, 별도의 VIEW/TRIGGER는 생성하지 않고, 암/복호화 쿼리를 삽입하여 암호화 테이 블에서 직접 암호화 데이터를 조회/수정 합니다. MEMBER (TABLE) MEMBER (TABLE) (MODIFY) A B C JUMIN_NO 8104191024363 A B C JUMIN_NO 81041910321D2FCD121E35 기 존 접 근 경 로 SELECT A,B,C,JUMIN_NO FROM MEMBER SELECT A,B,C,dbo.decrypt_var(‘AES’,JUMIN_NO,’’) JUMIN_NO FROM dbo.MEMBER 암호화 후 접근 경로 사용자 암호화 전 암호화 후 DP-MSQ 쿼리 최적화 가이드
VTI 모드 쿼리 최적화 방법
III. VTI 모드 쿼리 최적화 방법 1. 쿼리 최적화 방법 VTI모드 쿼리 최적화 방법 쿼리 최적화하는 방법은 매우 다양한 경우가 존재하지만 기본적으로 다음의 방식 중 하나 또는 복수의 방 법들을 사용합니다. 복호화 된 값 대신에 암호화 값을 직접 이용하도록 변경 view 대신에 암호화 테이블을 직접 참조하도록 대상 테이블 수정 쿼리에서 직접 암복호화 함수를 호출 인덱스의 효율을 높이기 위해 암호화 인덱스에 사용되는 인덱스 함수를 호출 DP-MSQ 쿼리 최적화 가이드
VTI모드 쿼리 최적화 방법 – 암복호화 함수 (1/2) III. VTI 모드 쿼리 최적화 방법 2. 암복호화 함수 VTI모드 쿼리 최적화 방법 – 암복호화 함수 (1/2) 암호화 함수 암호화 함수명(‘소유자’, ’테이블’, ’컬럼’, 암호화 하고자 하는 값) 컬럼 type에 따라 각기 다른 암호화 함수를 사용. 함수 인자는 모두 동일. ENCODE TYPE에 따라 사용 해야 하는 함수 명이 각각 다름에 주의 해야 한다. 암호화 함수 정보는 암호화 테이블의 SIT_**** Trigger Script에서 얻을 수 있음 DAMO.ENC_VARCHAR(‘DEV’, ‘dbo.CUST’, ‘SOC_NO’,SEC_SOC_NO) -- In case that type of “SOC_NO” is varchar NCHAR NVARCHAR CHAR VARCHAR VARBINARY ENC_NCHAR ENC_NVARCHAR ENC_CHAR ENC_VARCHAR HEX ENC_NCHAR_HEX ENC_NVARCHAR_HEX ENC_CHAR_HEX ENC_VARCHAR_HEX B64 ENC_NCHAR_B64 ENC_NVARCHAR_B64 ENC_CHAR_B64 ENC_VARCHAR_B64 부분암호화 ENC_NCHAR_PE ENC_NCHAR_PE_B64 ENC_NVARCHAR_PE ENC_NVARCHAR_PE_B64 ENC_CHAR_PE ENC_CHAR_PE_B64 ENC_VARCHAR_PE ENC_VARCHAR_PE_B64 DP-MSQ 쿼리 최적화 가이드
VTI모드 쿼리 최적화 방법 – 암복호화 함수 (2/2) III. VTI 모드 쿼리 최적화 방법 2. 암복호화 함수 VTI모드 쿼리 최적화 방법 – 암복호화 함수 (2/2) 복호화 함수 복호화 함수명(‘소유자’, ’테이블’, ’컬럼’, 일반값) 컬럼 type에 따라 각기 다른 복호화 함수를 사용. 함수 인자는 모두 동일. ENCODE TYPE에 따라 사용 해야 하는 함수 명이 각각 다름에 주의 해야 한다. 복호화 함수 정보는 암호화 테이블의 ****_ROOT View Script에서 얻을 수 있음 DAMO.DEC_VARCHAR(‘DEV’, ‘dbo.CUST’, ‘SOC_NO’,SEC_SOC_NO) -- In case that type of “SOC_NO” is varchar NCHAR NVARCHAR CHAR VARCHAR VARBINARY DEC_NCHAR DEC_NVARCHAR DEC_CHAR DEC_VARCHAR HEX DEC_NCHAR_HEX DEC_NVARCHAR_HEX DEC_CHAR_HEX DEC_VARCHAR_HEX B64 DEC_NCHAR_B64 DEC_NVARCHAR_B64 DEC_CHAR_B64 DEC_VARCHAR_B64 부분암호화 ENC_NCHAR_PE ENC_NCHAR_PE_B64 ENC_NVARCHAR_PE ENC_NVARCHAR_PE_B64 ENC_CHAR_PE ENC_CHAR_PE_B64 ENC_VARCHAR_PE ENC_VARCHAR_PE_B64 DP-MSQ 쿼리 최적화 가이드
VTI모드 쿼리 최적화 방법 – 인덱스 함수 평문값 인덱스 함수 III. VTI 모드 쿼리 최적화 방법 3. 인덱스 함수 VTI모드 쿼리 최적화 방법 – 인덱스 함수 평문값 인덱스 함수 평문암호화 인덱스 함수(‘소유자’,’테이블’,’컬럼’,값) : 평문값을 인덱스용 암호화 값으로 변환함. DAMO.DBO.PRED_META_PLAIN_V(‘710101-1234567’, ‘DEV’, ‘dbo.CUST’, ‘SOC_NO’) VARCHAR CHAR PRED_META_PLAIN_V PRED_META_PLAIN_C DP-MSQ 쿼리 최적화 가이드
VTI모드 쿼리 최적화 방법 – 단방향 함수 단방향(HASH) 함수 III. VTI 모드 쿼리 최적화 방법 4. 단방향 함수 VTI모드 쿼리 최적화 방법 – 단방향 함수 단방향(HASH) 함수 단방향 함수(값) : 평문을 단방향(HASH) 알고리즘으로 암호화 변환함. 단방향 함수의 경우 알고리즘 선택을 단방향 함수 스크립트(SCRIPT) 내 숫자 선택 수정으로 설정함. 알고리즘 파라미터 변경 후 HASH_STR_DATA 함수 재 생성 해야 적용됨 1: SHA256, 2: SHA512 ****기본값 : 1: SHA256 DAMO.DBO.HASH_STR_DATA(‘1234567890’) DP-MSQ 쿼리 최적화 가이드
VTI모드 쿼리 최적화 방법 – SELECT문 변경 (1/5) III. VTI 모드 쿼리 최적화 방법 5. SELECT문 변경 VTI모드 쿼리 최적화 방법 – SELECT문 변경 (1/5) 대량의 데이터를 처리하는 Inline Sub-Query 의 변경 불필요한 대량의 복호화 작업을 우회하여 암호화 값 자체로 비교하여 처리 Inline Sub-Query 결과 : 10만 건, 최종 결과값 : 20건 10만 건의 모든 데이터를 복호화 하는 것은 매우 큰 성능저하를 불러옴 10만 건의 모든 데이터를 복호화 하는 것 대신 사용자에게 보여줄 최종 결과인 20건에 대한 복호화만 하도록 쿼리 수 정을 통하여 성능 개선 SELECT A.A, A.SOC_NO, B.DEPT_NAME FROM (SELECT A, SOC_NO FROM CUST) A, CUST_DEP B WHERE A.A = B.A; SELECT A.A, SUBSTRB(DAMO.DBO.DEC_VARCHAR (‘DEV’, ‘dbo.CUST’, ‘SOC_NO’, A.SOC_NO),1,14), B.DEPT_NAME FROM (SELECT A, SEC_SOC_NO as SOC_NO FROM dbo.CUST_DAMO) A, CUST_DEP B WHERE A.A = B.A; DP-MSQ 쿼리 최적화 가이드
VTI모드 쿼리 최적화 방법 – SELECT문 변경 (2/5) III. VTI 모드 쿼리 최적화 방법 5. SELECT문 변경 VTI모드 쿼리 최적화 방법 – SELECT문 변경 (2/5) 암호화 컬럼으로 일치 검색(=) 최적화 방안 (암호화 값 자체 인덱스로 비교) 암호화 컬럼에 인덱스가 존재한다면 암호화 마이그레이션시 인덱스 암호화 컬럼도 생성하였을 것이기에 인덱스 암호화 컬럼을 사용한다. 암호화 적용 시 반드시 IV모드는 Column IV로 설정 인덱스 컬럼절 (A, SOC_NO, B) -> (A, SEC1_SOC_NO, B) SELECT A, SOC_NO, B, C FROM CUST WHERE A = 1 AND SOC_NO = ‘710101-1234567’ AND B = 1000; SELECT A, SUBSTRB(DAMO.DBO.DEC_VARCHAR (‘DEV’, ‘CUST’, ‘SOC_NO’, SEC_SOC_NO),1,14), B FROM CUST_DAMO WHERE A = 1 AND SEC1_SOC_NO = DAMO.DBO.PRED_META_PLAIN_V(‘DEV’,’CUST’,’SOC_NO’, ‘710101-1234567’) AND B = 1000; DP-MSQ 쿼리 최적화 가이드
VTI모드 쿼리 최적화 방법 – SELECT문 변경 (3/5) III. VTI 모드 쿼리 최적화 방법 5. SELECT문 변경 VTI모드 쿼리 최적화 방법 – SELECT문 변경 (3/5) 암호화 컬럼 간에 JOIN 검색인 경우 암호화 컬럼간에 Join 검색인 경우 쿼리 수정을 하지 않는다면 Full Table Scan으로 처리되어 성능 저하 크게 발생 Join 테이블의 두 개의 암호화 대상 컬럼(SEC_컬럼)에 일반 인덱스(Normal INDEX)를 설정 암호화 적용 시 두 개의 Join 대상 암호화 컬럼 모두 Column IV와 동일한 Key로 암호화 적용 (필수) SELECT A.A, A.SOC_NO, B.DEPT_NAME FROM CUST A, CUST_DEP B WHERE A.SOC_NO = B.SOC_NO; SELECT A.A, SUBSTRB(DAMO.DEC_VARCHAR (‘DEV’, ‘CUST’, ‘SOC_NO’, A.SEC_SOC_NO),1,14), B.DEPT_NAME FROM CUST_DAMO A, CUST_DEP_DAMO B WHERE A.SEC1_SOC_NO = B.SEC1_SOC_NO; DP-MSQ 쿼리 최적화 가이드
VTI모드 쿼리 최적화 방법 – SELECT문 변경 (4/5) III. VTI 모드 쿼리 최적화 방법 5. SELECT문 변경 VTI모드 쿼리 최적화 방법 – SELECT문 변경 (4/5) 암호화 컬럼 간에 JOIN 검색과 값에 의한 일치 검색 함께 공존하는 경우 암호화 컬럼간에 Join 검색이 들어간 쿼리의 경우 최적화를 하지 않는다면 Full Table Scan으로 성능 저하 발생 Join 테이블의 두 개의 암호화 대상 컬럼(SEC1_컬럼)에 일반 인덱스(Normal INDEX)를 설정 암호화 적용 시 두 개의 Join 대상 암호화 컬럼 모두 Fixed IV와 동일한 Key로 암호화 적용 (필수) SELECT A.A, A.SOC_NO, B.DEPT_NAME FROM CUST A, CUST_DEP B WHERE A.SOC_NO = B.SOC_NO AND A.SOC_NO = ‘710101-1234567’; SELECT A.A, SUBSTRB(DAMO.DEC_VARCHAR (‘DEV’, ‘CUST’, ‘SOC_NO’, A.SEC_SOC_NO),1,14), B.DEPT_NAME FROM CUST_DAMO A, CUST_DEP_DAMO B WHERE A.SEC1_SOC_NO = B.SEC1_SOC_NO AND A.SEC1_SOC_NO = DAMO.ENC_VARCHAR (‘DEV’, ‘CUST’, ‘SOC_NO’, ‘710101-1234567’); DP-MSQ 쿼리 최적화 가이드
VTI모드 쿼리 최적화 방법 – SELECT문 변경 (5/5) III. VTI 모드 쿼리 최적화 방법 5. SELECT문 변경 VTI모드 쿼리 최적화 방법 – SELECT문 변경 (5/5) 전체 암호화 컬럼으로 범위 검색 최적화 방안 전체 암호화 컬럼으로 범위 검색인 경우 기본적으로 암호화 인덱스를 사용하여 빠른 결과값을 얻을 수 있지만 옵티마이 져(Optimizer)의 판단에 따라 Full Table Scan으로 처리되면 성능 저하 크게 발생 이 경우는 반드시 쿼리 수정을 해야 하며 Join 테이블의 두 개의 SEC1_컬럼에 일반 인덱스를 설정하여 처리해야 합니다 주민번호 컬럼으로 범위 검색 예시 SELECT A.A, A.SOC_NO, B.DEPT_NAME FROM CUST A, CUST_DEP B WHERE A.SOC_NO = B.SOC_NO AND A.SOC_NO LIKE ’71%’; SELECT A.A, SUBSTRB(DAMO.DBO.DEC_VARCHAR (‘DEV’, ‘CUST’, ‘SOC_NO’, A.SEC_SOC_NO),1,14), B.DEPT_NAME FROM CUST_DAMO A, CUST_DEP_DAMO B WHERE A.SEC1_SOC_NO = B.SEC1_SOC_NO AND A.SEC1_SOC_NO LIKE DAMO.DBO.PRED_META_PLAIN_V(’71’, ‘DEV’, ‘CUST’, ‘SOC_NO’) || ‘%’; DP-MSQ 쿼리 최적화 가이드
API 모드 쿼리 최적화 방법
IV. API 모드 쿼리 최적화 방법 1. 쿼리 최적화 방법 API 모드 쿼리 최적화 방법 쿼리 최적화하는 방법은 매우 다양한 경우가 존재하지만 기본적으로 다음의 방식 중 하나 또는 복수의 방 법들을 사용합니다. 복호화 된 값 대신에 암호화 값을 직접 이용하도록 변경 쿼리, 프로시져, 패키지에서 직접 암복호화 함수를 호출 LIKE, BETWEEN 검색을 위한 암호화 인덱스 생성 및 암호화 인덱스 함수를 호출 비밀번호 암호화를 위한 단방향 암호화 함수를 호출 DP-MSQ 쿼리 최적화 가이드
API 모드 쿼리 최적화 방법 – 암복호화 함수 (1/2) IV. API 모드 쿼리 최적화 방법 2. 암복호화 함수 API 모드 쿼리 최적화 방법 – 암복호화 함수 (1/2) 암호화 함수 암호화 함수명(‘정책명’, ‘암호화 하고자 하는 값’, ‘로그 정보’) – 로그정보는 생략 가능 함. DAMO.DBO.ENCRYPT_VAR(‘AES_128’, ’8104191111111’, ‘’) DAMO.DBO.ENCRYPT_VAR(‘AES_128’, ’8104191111111’, ‘OWNER||TABLE||COLUMN’) NCHAR NVARCHAR CHAR VARCHAR VARBINARY ENCRYPT_NCHR ENCRYPT_NVAR ENCRYPT_CHR ENCRYPT_VAR HEX ENCRYPT_NCHR_HEX ENCRYPT_NVAR_HEX ENCRYPT_CHR_HEX ENCRYPT_VAR_HEX B64 ENCRYPT_NCHR_B64 ENCRYPT_NVAR_B64 ENCRYPT_CHR_B64 ENCRYPT_VAR_B64 부분암호화 ENC_NCHAR_PE ENC_NCHAR_PE_B64 ENC_NVARCHAR_PE ENC_NVARCHAR_PE_B64 ENC_CHAR_PE ENC_CHAR_PE_B64 ENC_VARCHAR_PE ENC_VARCHAR_PE_B64 DP-MSQ 쿼리 최적화 가이드
API 모드 쿼리 최적화 방법 – 암복호화 함수 (2/2) IV. API 모드 쿼리 최적화 방법 2. 암복호화 함수 API 모드 쿼리 최적화 방법 – 암복호화 함수 (2/2) 복호화 함수 복호화 함수명(‘정책명’, ‘암호화 하고자 하는 값’, ‘로그 정보’) - 로그정보는 생략 가능 함. DAMO.DBO.DECRYPT_VAR(‘AES_128’, ’8104191111111’, ‘’) DAMO.DBO.DECRYPT_VAR(‘AES_128’, ’8104191111111’, ‘OWNER||TABLE||COLUMN’) NCHAR NVARCHAR CHAR VARCHAR VARBINARY DECRYPT_NCHR DECRYPT_NVAR DECRYPT_CHR DECRYPT_VAR HEX DECRYPT_NCHR_HEX DECRYPT_NVAR_HEX DECRYPT_CHR_HEX DECRYPT_VAR_HEX B64 DECRYPT_NCHR_B64 DECRYPT_NVAR_B64 DECRYPT_CHR_B64 DECRYPT_VAR_B64 부분암호화 DECRYPT_NCHR_PE DECRYPT_NCHR_PE_B64 DECRYPT_NVAR_PE DECRYPT_NVAR_PE_B64 DECRYPT_CHR_PE DECRYPT_CHR_PE_B64 DECRYPT_VAR_PE DECRYPT_VAR_PE_B64 DP-MSQ 쿼리 최적화 가이드
최적화된 쿼리 검증 방법
최적화된 쿼리 검증 방법 최적화된 쿼리 수행 결과 정합성 최적화된 쿼리 수행 전후 동일한 결과 보장 V. 최적화된 쿼리 검증 방법 최적화된 쿼리 검증 방법 최적화된 쿼리 수행 결과 정합성 최적화된 쿼리 수행 전후 동일한 결과 보장 쿼리를 최적화하기 이전의 쿼리 수행 결과와 쿼리를 최적화한 후의 쿼리 수행 결과는 동일한지 확인해야 합니다. 수행 결과 Rows 수행 결과 List 최적화된 쿼리에 대한 실행 계획 (Execution Plan) 점검 최적화된 쿼리의 실행 계획을 점검하여 의도한 바와 같이 실행 계획이 수립되었는지 확인해야 합니다. 암호화 작업을 반영한 실행 계획의 COST 가 절절한 수준인지 점검하는 것이 바람직합니다. DP-MSQ 쿼리 최적화 가이드
최적화된 쿼리 검증 방법 실행 계획 COST 확인 V. 최적화된 쿼리 검증 방법 최적화된 쿼리 검증 방법 실행 계획 COST 확인 SQL Server Management Studio에서 실행 계획 확인하기 실행계획 보여주기 버튼을 클릭 후 수행하고자 하는 SQL을 실행한 후 COST 확인 DP-MSQ 쿼리 최적화 가이드
주의사항
주의사항 최적화의 한계 최적화가 적합하지 않은 쿼리 유형 암호화 이전에 Tuning 된 쿼리의 최적화 기존 쿼리 로직 변경 VI. 주의사항 주의사항 최적화의 한계 최적화가 적합하지 않은 쿼리 유형 Sum, Avg 등과 같은 집합 함수는 쿼리를 수정해도 최적화 되지 않는 경우가 있습니다. 암호화 이전에 Tuning 된 쿼리의 최적화 많은 조합의 Hint로 이미 Tuning이 된 쿼리는 암호화 이후 최적화 과정에서 Tuning 효과를 상쇄시키는 경우가 발생할 수 있습 니다. 기존 쿼리 로직 변경 기존 쿼리의 로직 Format을 유지한 체, 쿼리를 최적화하는 경우 성능이 보장 되지 않는 경우가 있다. 이런 경우는 쿼리 수행 로 직 변경을 시도해 볼 수 있습니다. 인덱스의 변경 요구 결합 인덱스 구성 컬럼 중 일부만이 암호화 되어, 인덱스 효율 자체가 변경됨으로써 수행 속도 저하가 발생될 수 있다. 이런 경 우 암호화에 맞는 인덱스 생성 전략을 구사해 볼 수 있습니다. 추가 암호화 요구 복수개 테이블 컬럼의 JOIN 시 한쪽만 암호화되어 있고 다른 쪽이 안되어 있는 경우 최적화를 해도 성능 저하를 피할 수 없는 경우가 발생될 수 있습니다. 이런 경우 JOIN 되는 컬럼을 동일 키로 암호화 한 후 인덱스 전략과 병행하여 성능 향상을 시도해 볼 수 있습니다. DP-MSQ 쿼리 최적화 가이드