我在DB2 sql中遇到了一個奇怪的行爲。 (DB2 9.7) 遵循的是一個簡單的查詢來獲取員工工資,地位和帶..DB2內部查詢速度慢但硬編碼值很快
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萬左右行。其餘桌子非常小。 查詢約需10secs執行
但是,當我硬編碼的內部查詢
從
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風雲」表是一個非常小桌子與約50行,所以我不知道爲什麼內查詢所花費的時間本身時,其動態的,但速度非常快,當我硬編碼
一些附加信息
- EMPID是整數
- DATE_TS是時間戳
- CURRENT_DT,JOIN_DT是日期
- 其餘全部都是VARCHAR
- EMPID被索引
「EMP1.JOIN_DT」,「EMP1.DATE_TS」和「FY.CURRENT_DT」的數據類型是什麼?什麼是示例值? *(你的問題的原因是你正在加入的字段上調用函數「DATE」,這樣做會破壞**使用索引的能力。)* – MatBailie
@Dems我最初的想法是。但是,當我的硬編碼是完全一樣的?如果單獨查詢,FY.CURRENT_DT將以毫秒爲單位。 – diaryfolio
您是否看過訪問計劃?它說什麼? – AngocA