适用于SQL 的where 条件里的时间字段为date类型,但SQL条件的右侧对参数值用了timestamp函数,引起date(低精度) 转timestamp(高精度)的隐式转换。导致SQL无法使用到index的场景。
因where 条件的时间字段为date类型,但SQL语句里存在从低精度date向高精度timestamp的隐式转换。而使SQL查询条件无法使用到index。查询速度不符合预期。
时间精度不同产生的隐式转换。
调整时间精度为互相匹配的精度。(即右侧入参类型降为date类型) WHERE end_date = timestamp '2022-04-17 00:00:00' 改为:WHERE end_date = date '2022-04-17' 或 TO_DATE('2022-04-17 00:00:00', 'SYYYY-MM-DD HH24:MI:SS') 或 TO_DATE('2022-04-17', 'SYYYY-MM-DD') 均可。
SELECT count(*)
FROM yh_test_testinfor_detail
WHERE end_date = timestamp '2022-04-17 00:00:00'
AND IS_INVOICE = 'Y'
AND AMT_TYPE = 'PRI'
AND internal_key
BETWEEN 101269
AND 4954642;
+----------+
| COUNT(*) |
+----------+
| 146 |
+----------+
1 row in set (3.94 sec)
| ===========================================================================================================
|ID|OPERATOR |NAME |EST. ROWS|COST |
-----------------------------------------------------------------------------------------------------------
|0 |SCALAR GROUP BY | |1 |7926020|
|1 | PX COORDINATOR | |1 |7924442|
|2 | EXCHANGE OUT DISTR |:EX10000 |1 |7924441|
|3 | MERGE GROUP BY | |1 |7924441|
|4 | PX PARTITION ITERATOR| |8262 |7922863|
|5 | TABLE SCAN |yh_test_testinfor_detail(yh_test_testinfor_detail_HASH_IND3)|8262 |7922863|
===========================================================================================================
Outputs & filters:
-------------------------------------
0 - output([T_FUN_COUNT_SUM(T_FUN_COUNT(*)(0x7ef47bb42540))(0x7ef47bb9b610)]), filter(nil),