我在 DB2 sql 中遇到了一个奇怪的行为。(DB2 9.7) Follow 是一个示例查询,用于获取员工工资、状态和乐队。
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'
结果在一秒钟之内!
“FINANCIAL_YEAR FY”表是一个非常小的表,大约有 50 行,因此我不知道为什么内部查询在动态时需要时间,但在我硬编码时非常快
一些附加信息
- EMPID 是整数
- DATE_TS 是时间戳
- CURRENT_DT,JOIN_DT 是日期
- 其余都是 VARCHAR
- EMPID 已编入索引