有这个存储过程构建一个动态查询字符串然后执行它。sp 在开发和测试环境中运行良好,但客户公司的 DBA 已告知此查询对生产中的数据库造成了很大的影响。IT 部门已要求我们调整查询。到目前为止一切顺利,我们已经将几乎所有这些 sp 从动态构建查询字符串转移到执行非常快的单个大查询(与旧查询相比)。
我们发现(除其他外)sp 通过评估参数是否具有默认值或实际值来构建查询字符串的 where 子句,即
IF P_WORKFLOWSTATUS <> 0 THEN
L_SQL := TRIM(L_SQL) || ' AND WORKFLOW.STATUS = ' || TO_CHAR(P_WORKFLOWSTATUS);
END IF;
所以我们优化了这个行为
WHERE
...
AND (WORKFLOW.STATUS = P_WORKFLOWSTATUS OR P_WORKFLOWSTATUS = 0)
这种更改改进了影响数字列的查询,但我们发现 VARCHAR2 参数和列存在问题。当前的行为是
--CLIENT.CODE is a VARCHAR2(14) column and there is an unique index for this column.
--The data stored in this field is like 'N0002077123', 'E0006015987' and similar
IF NVL(P_CLIENT_CODE, '') <> '' THEN
L_SQL := TRIM(L_SQL) || ' AND CLIENT.CODE = ''' || P_CLIENT_CODE || '''';
END IF;
我们试图通过这样做将其更改为我们优化的查询版本
WHERE
...
AND (CLIENT.CODE = P_CLIENT_CODE OR NVL(P_CLIENT_CODE, '') = '')
但是这种变化使查询失去了性能。有没有办法优化这部分查询,或者我们应该将我们的大查询(再次)变成一个动态查询,只是为了评估是否VARCHAR2
应该将这个参数添加到 where 子句中?
提前致谢。