暂无图片
Oceanbase where条件时间字段不同精度比较隐式转换 SQL 调优
最近更新:2022-08-22 10:35:33

适用范围

适用于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') 均可。

详细过程

1.原始SQL 及执行时间

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)

2.原始SQL执行的执行计划

| ===========================================================================================================
|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), 
......