【发布时间】:2018-09-12 12:11:55
【问题描述】:
日期范围查询耗时过长。 只是我删除了一个条件,然后它工作正常需要 2 秒。如果添加 然后 30 秒。
SELECT UserName,COUNT ('t') TOTAL
FROM TRANSACTIONS E1
WHERE E1.START_DATE BETWEEN TO_DATE ('20130101', 'YYYYMMDD') AND TO_DATE ('20140101', 'YYYYMMDD')
AND
(
TO_CHAR (E1.START_DATE, 'D') in ( 7)
OR Exists(SELECT 1 FROM HOLIDAYS TT
WHERE E1.START_DATE BETWEEN TT.DATE_FROM AND TT.DATE_TO )
)
AND EXISTS (SELECT 't' FROM TRANSACTIONS_ORG E2 WHERE E1.TRANTYPE = E2.tran_type)
GROUP BY UserName;
HOLIDAYS 表
Id FromDate ToDate Description
1 1-Feb-11 3-Feb-11 Maintance
3 2-Sep-09 5-Sep-09 Eid Holiday Fine Block
4 3-Dec-09 4-Dec-09 Due to System Problem
5 4-Dec-07 04-Dec-07 National Day
EIDTED 我发现问题不在日期范围内。但是
中的OR子句TO_CHAR (E1.START_DATE, 'D') in ( 5,6)
OR
Exists(SELECT 1 FROM HOLIDAYS TT
WHERE E1.START_DATE BETWEEN TT.DATE_FROM AND TT.DATE_TO )
如果删除 OR 并放入 AND 则很好,如果使用 OR 的随机条件仍然是相同的问题。
【问题讨论】:
-
HOLIDAYStableSTART_DATE被索引了吗? -
@RehanAzher 是在
id上编入索引 -
也尝试在 START_DATE 建立索引。
-
为什么需要"count(TT.DATE_FROM)" 也许只用1(从...中选择1)
-
注意,
TO_CHAR (..., 'D')的结果取决于当前用户会话NLS_TERRITORY设置,该设置可能随时更改。更好地使用TO_CHAR(..., 'Dy', 'NLS_DATE_LANGUAGE=American') IN ('Sat','Sun')
标签: sql oracle oracle11g query-optimization