로컬 술어의 컬럼에 대한 표현식 회피

로컬 술어의 컬럼에 대해 표현식을 적용하는 대신 표현식의 역을 사용하십시오.

다음 예를 고려해보십시오.
XPRESSN(C) = 'constant'
INTEGER(TRANS_DATE)/100 = 200802
이러한 명령문을 다음과 같이 다시 쓸 수 있습니다.
C = INVERSEXPRESSN('constant')
TRANS_DATE BETWEEN 20080201 AND 20080229
컬럼에 대해 표현식을 적용하면 인덱스 시작 및 중지 키의 사용이 방지되어, 부정확한 선택 빈도 추정으로 이어질 수 있고, 쿼리 실행 시간에 추가 처리가 요구됩니다.
이러한 표현식은 또한 컬럼이 동등할 때 인식, 컬럼을 상수로 교체 및 많아야 하나의 행이 리턴될 때 인식과 같은 쿼리 재작성 최적화를 막습니다. 많아야 하나의 행이 리턴됨이 증명될 수 있어야 추가 최적화가 가능하므로, 상실된 최적화 기회가 더 악화됩니다. 다음 쿼리를 고려해보십시오.
SELECT LASTNAME, CUST_ID, CUST_CODE FROM CUST 
WHERE (CUST_ID * 100) + INT(CUST_CODE) = 123456 ORDER BY 1,2,3
이것을 다음과 같이 다시 쓸 수 있습니다.
SELECT LASTNAME, CUST_ID, CUST_CODE FROM CUST 
WHERE CUST_ID = 1234 AND CUST_CODE = '56' ORDER BY 1,2,3

CUST_ID에 정의된 고유 인덱스가 있는 경우, 다시 쓴 버전의 쿼리를 통해 쿼리 옵티마이저는 많아야 하나의 행이 리턴되는 것을 인식할 수 있습니다. 이는 불필요한 SORT 조작의 사용을 막아줍니다. 또한 CUST_ID 및 CUST_CODE 컬럼이 1234와 '56'으로 대체될 수 있게 하여 데이터 또는 인덱스 페이지에서 값을 복사하지 않게 해 줍니다. 마지막으로, CUST_ID의 술어가 인덱스 시작 또는 중지 키로 적용될 수 있게 해 줍니다.

표현식이 술어에 있는 경우에는 항상 분명하지 않을 수도 있습니다. 이것은 표현식에 의해 뷰 컬럼이 정의된 경우 뷰를 참조하는 쿼리에서 종종 발생할 수 있습니다. 예를 들어, 다음 뷰 정의 및 쿼리를 고려해보십시오.
CREATE VIEW CUST_V AS
  (SELECT LASTNAME, (CUST_ID * 100) + INT(CUST_CODE) AS CUST_KEY
    FROM CUST)

SELECT LASTNAME FROM CUST_V WHERE CUST_KEY = 123456
쿼리 옵티마이저는 뷰 정의와 쿼리를 병합하여, 다음 쿼리를 만듭니다.
SELECT LASTNAME FROM CUST
WHERE (CUST_ID * 100) + INT(CUST_CODE) = 123456
이것은 위의 예에서 설명된 동일한 문제가 있는 술어입니다. Explain 기능을 사용해 뷰 병합의 결과를 관찰하여 최적화된 SQL을 표시할 수 있습니다.
역 함수를 표현하기 어려운 경우, 생성된 컬럼 사용을 고려하십시오. 예를 들어, LASTNAME IN ('Woo', 'woo', 'WOO', 'WOo',...)(으)로 표현된 기준에 맞는 성을 찾으려는 경우, 다음과 같이 생성된 컬럼 UCASE(LASTNAME) = 'WOO'을(를) 작성할 수 있습니다.
CREATE TABLE CUSTOMER (
  LASTNAME VARCHAR(100),
  U_LASTNAME VARCHAR(100) GENERATED ALWAYS AS (UCASE(LASTNAME))
)

CREATE INDEX CUST_U_LASTNAME ON CUSTOMER(U_LASTNAME)

Db2® Database for Linux®, UNIX, and Windows 버전 9.5 수정팩 1에 도입된 대소문자를 구분하지 않는 검색에 대한 지원은 이 특정 예제의 상황을 해결하도록 설계되었습니다. 로케일 구분 UCA 기반 데이터 정렬에서 _Sx 속성을 사용하여 데이터 정렬의 강도를 제어할 수 있습니다. 예를 들어, _LFR_S1 속성을 사용하는 로케일 구분 UCA 기반 데이터 정렬은 대소문자 및 액센트를 무시하는 프랑스어 데이터 정렬입니다.