DB2 SQL で奇妙な動作が発生しています。(DB2 9.7) 以下は、従業員の給与、ステータス、バンドを取得するサンプル クエリです。
SELECT
EMP.STATUS,
COUNT(*) AS EMP_COUNT,
GRP.GROUP_NAME
FROM
EMPLOYEE EMP,
EMPLOYEE_SALARY ES,
GROUP_TABLE GRP
WHERE
EMP.SALARY >
(select max(EMP1.SALARY) from
EMPLOYEE EMP1, FINANCIAL_YEAR FY where
date(EMP1.JOIN_DT) = '2013-01-01'
and date(EMP1.DATE_TS) = date(FY.CURRENT_DT) - 2 days)
AND EMP.SALARY = E.EMPID
AND E.SALARY_GRP = GRP.BAND_GROUP
AND GRP.RANGE_SALARY = 'BAND-10'
GROUP BY
EMP.STATUS,
GRP.GROUP_NAME
EMP (従業員) テーブルには、約 100 万行が含まれています。残りのテーブルは非常に小さいです。クエリの実行には約 10 秒かかります
しかし、内部クエリをハードコーディングすると
から
select max(EMP1.SALARY) from EMPLOYEE EMP1, FINANCIAL_YEAR FY where
date(EMP1.JOIN_DT) = '2013-01-01'
and date(EMP1.DATE_TS) = date(FY.CURRENT_DT) - 2 days
に
select max(EMP1.SALARY) from EMPLOYEE EMP1, FINANCIAL_YEAR FY where
date(EMP1.JOIN_DT) = '2013-01-01'
and date(EMP1.DATE_TS) = '2013-06-01'
結果は1秒以内に来ます!!
「FINANCIAL_YEAR FY」テーブルは約50行の非常に小さなテーブルであるため、動的なときに内部クエリに時間がかかる理由がわかりませんが、ハードコーディングすると非常に高速です
いくつかの追加情報
- EMPID は整数です
- DATE_TS はタイムスタンプです
- CURRENT_DT、JOIN_DT は日付
- 残りはすべて VARCHAR です
- EMPID は索引付けされています