【发布时间】:2017-06-08 00:55:01
【问题描述】:
我必须减少它的执行时间。当我刚刚插入“:i_member_name”时,这个语句处理浪费了大约30分钟,所有其他都是空的。
SELECT
A.MEMBER_NUM, A.MEMBER_NAME, B.MEMBER_INFO FROM REG_MEMBER A, MEMBER_DETAIL B
WHERE A.MEMBER_ID = B.MEMBER_ID
AND (LOWER(A.MEMBER_NAME) LIKE LOWER(:i_member_name || '%'))
AND (LOWER(B.MEMBER_INFO) LIKE LOWER(:i_member_info || '%'))
AND (A.MEMBER_NUM LIKE :i_member_num || '%')
AND (LOWER(B.MEMBER_ADD) LIKE LOWER('%' || :i_member_add || '%'))
如果我这样执行,那没关系,只是浪费了 30 秒。
SELECT
A.MEMBER_NUM, A.MEMBER_NAME, B.MEMBER_INFO FROM REG_MEMBER A, MEMBER_DETAIL B
WHERE A.MEMBER_ID = B.MEMBER_ID
AND (LOWER(A.MEMBER_NAME) LIKE LOWER(:i_member_name || '%'))
--AND (LOWER(B.MEMBER_INFO) LIKE LOWER(:i_member_info || '%'))
--AND (A.MEMBER_NUM LIKE :i_member_num || '%')
--AND (LOWER(B.MEMBER_ADD) LIKE LOWER('%' || :i_member_add || '%'))
所以我有一个问题:如何检查参数是否为空,然后不要读取更多执行时间。像这样的
SELECT A.MEMBER_NUM, A.MEMBER_NAME, B.MEMBER_INFO FROM REG_MEMBER A, MEMBER_DETAIL B
WHERE
(LOWER(A.MEMBER_NAME) LIKE LOWER(:i_member_name || '%'))
and case when :i_member_num is null then return
else (A.MEMBER_NUM LIKE :i_member_num || '%')
end
【问题讨论】:
-
使用布尔逻辑。将
AND (LOWER(B.MEMBER_INFO) LIKE LOWER(:i_member_info || '%'))更改为(AND (LOWER(B.MEMBER_INFO) LIKE LOWER(:i_member_info || '%')) OR :i_member_info IS NULL)。但这可能没有什么不同 - 您需要使用查询计划来检查 -
也许还有另一种方法 - 在
lower(member_name)等上创建索引?由于您必须在lower()内进行包装,因此member_name本身的索引将无济于事。 -
你能详细说明一下吗?
标签: sql oracle select parameters case-when