关于EBS Form 的LOV长值列表 查询效率异常问题处理

本文探讨了Oracle LOV查询中出现的性能瓶颈,并详细分析了由于大小写不敏感查询导致的问题根源。通过创建特定索引的方法显著提升了查询效率。

最近用户经常反馈和任务单相关的查询界面非常慢。并且都是很精确的查询。
正常来说,选择性好的查询(直接输入任务单的唯一编号了)应该速度很快的。
但是,为何这个查询慢(超过30秒)?不合理的现象,而且还是标准功能:
这里写图片描述
这里写图片描述

跟踪了这个查询对应的SQL,发现是这样子的:

  SELECT wip_entity_name, wip_entity_id
    FROM wip_entities
   WHERE (UPPER(WIP_ENTITY_NAME) LIKE :1
      AND (WIP_ENTITY_NAME LIKE :2
        OR WIP_ENTITY_NAME LIKE :3
        OR WIP_ENTITY_NAME LIKE :4
        OR WIP_ENTITY_NAME LIKE :5))
     AND (organization_id = :6)
ORDER BY wip_entity_name

然后看绑定变量,是这样子的:

Binds*
=================================================
| Name | Position | Type         | Value        |
=================================================
| :1   |        1 | VARCHAR2(32) | SL170221390% |
| :2   |        2 | VARCHAR2(32) | sl%          |
| :3   |        3 | VARCHAR2(32) | sL%          |
| :4   |        4 | VARCHAR2(32) | Sl%          |
| :5   |        5 | VARCHAR2(32) | SL%          |
| :6   |       *6 | NUMBER       | 189          |
=================================================

再看执行计划:
这里写图片描述

从SQL以及对应绑定变量,还有执行计划,可以看出:
这个准确的查询,被Oracle自动添加了一个Upper函数,从而无法用到选择性最好的关键字过滤,导致查询缓慢。而且会随着数据量的增加,这个查询会越来越慢的。

真的很奇怪,查询的时候,明明我输入了SL170221390,在LOV过滤的时候应该直接用:
WIP_ENTITY_NAME LIKE :1
就是:WIP_ENTITY_NAME LIKE ‘SL170221390%’就可以查询到结果了啊,这样子也是最有效率的。为什么偏偏要加一个UPPER函数呢?
经过不断的测试,加上本人对EBS系统的处理逻辑的理解,我确认了应该是这个原因导致:
原来是Oracle的LOV长值列表的自动处理逻辑导致:长值列表 的关键字查询 不区分大小写!
也就是说,LOV:Let the user filter records before dislaying them(Fliter Before Display)设置为Yes的查询,在做Fliter的时候,关键字自动做了不区分大小写的效果!
正是因为Oracle要达到这个效果,所以才自动套一个转大写的函数来做查询。
举个简单的例子:
在Lov里面,查询WORK_REQUEST_FNAME段:erp%
如果不区分大小写,则LOV查询的时候,自动转换为:
AND (UPPER(WORK_REQUEST_FNAME) LIKE ‘ERP%’
AND (WORK_REQUEST_FNAME LIKE ‘er%’
OR WORK_REQUEST_FNAME LIKE ‘eR%’
OR WORK_REQUEST_FNAME LIKE ‘Er%’
OR WORK_REQUEST_FNAME LIKE ‘ER%’))
这样子,所有包括ERP%关键字(不区分大小写)的数据都会搜索出来。

对不区分大小写的查询的处理探索:

--根据结果,猜测其处理的规律:
首先系统看查询的关键字是否有包括字母。
如果完全没包括字母,就是查询的关键字是纯数字,则默认是最有效率的查询:EMPLOYEE_NUMBER LIKE :1
只要是包括字母,则默认当前字段是自动添加函数:UPPER(EMPLOYEE_NUMBER) LIKE :1 (注意这里的:1是自动大写了,例如2144wsB92 会自动变为:2144WSB92%)
然后,自动添加前2个字符的各种不同的组合来做查询!
例如:
wsb214492:4种可能性 ws  WS  Ws wS
w214492:2种可能性 W2 w2
214492www:1种可能性 21

不得不说,这个效果还是很不错的。因为很多时候用户查询的时候确实可能大小写混用,导致查询没结果。
不过这个处理逻辑的副作用就是用不到该段的索引!最郁闷的是,目前没发现哪里可以设定!(如果哪个兄台知道这个的设定的麻烦留言一下,十分感谢!)

所以,针对这个问题,目前的解决办法只好是:在长值列表的主要搜索字段添加一个UPPER的函数索引。这样子就算LOV自动帮我们加一个UPPER函数,也可以用到对应段的索引了。

CREATE UNIQUE INDEX WIP.WIP_ENTITIES_U3 ON WIP.WIP_ENTITIES
(UPPER(WIP_ENTITY_NAME), ORGANIZATION_ID)
NOLOGGING
TABLESPACE APPS_TS_TX_IDX;

添加之后的查询执行计划是:

SQL_ID  dxcuk5cb89qk5, child number 0
-------------------------------------
select wip_entity_name, wip_entity_id from wip_entities where ( 
UPPER(WIP_ENTITY_NAME) LIKE :1 AND (WIP_ENTITY_NAME LIKE :2 OR 
WIP_ENTITY_NAME LIKE :3 OR WIP_ENTITY_NAME LIKE :4 OR WIP_ENTITY_NAME 
LIKE :5)) AND ( organization_id = :6 ) order by wip_entity_name

Plan hash value: 269543263

-------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name            | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                 |        |       |    13 (100)|          |
|   1 |  SORT ORDER BY               |                 |      1 |   145 |    13   (8)| 00:00:01 |
|*  2 |   TABLE ACCESS BY INDEX ROWID| WIP_ENTITIES    |      1 |   145 |    12   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN          | WIP_ENTITIES_U3 |     20 |       |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------

至此,问题得到解决!
其实我觉得最好的解决办法应该是有一个这样子的设定:LOV过滤不区分大小写。默认为Yes,如果设置为No,则就是区分大小写的查询处理,没必要添加什么UPPER函数!

备注:
Form表单的栏位有一个属性:Case Insensitive Query,默认为No(Flase),其实就是这个意思。如果设置为Yes,则您按F11做栏位的查询的时候,会自动添加不区分大小写的查询逻辑。有兴趣的兄台可以试试!

<think>首先,用户的问题是:“我想在OracleEBS系统中查找或配置LOV集的方法或相关信息请问OracleEBSLOV集配置方法使用指南”。这涉及到OracleE-BusinessSuite(EBS)中的LOV集配置。我需要参考提供的引用:-引用[1]:关于从FORM界面获取LOV的SQL语句,展示了如何查询组织单位。-引用[2]:讨论了LOV速度优化的问题。-引用[3]:涉及集附加列,包括如何使用$FLEX$.来调用参数。-引用[4]:关于在FORM中使用LOV的代码片段。用户的核心需求是配置LOV集的方法和使用指南。LOV(ListofValues)在OracleEBS中常用于提供下拉列表或弹出列表供用户选择。我的回答应该结构清晰,帮助用户逐步解决问题。使用中文回答。结构化回答:1.**介绍LOV集**:简要解释LOV集是什么及其在EBS中的作用。2.**配置步骤**:详细描述如何在OracleEBS中配置LOV集,包括导航路径和具体操作。3.**常见配置选项**:解释集类型、验证规则等。4.**优化建议**:根据引用[2],提供LOV速度优化的方法。5.**使用示例**:提供一些代码或SQL示例,如从引用中提取的信息。6.**生成相关问题**:在结尾部分添加相关问题,以帮助用户进一步探索。确保符合系统级指令:-所有行内数学表达式用$...$格式(但这里可能不涉及数学表达式)。-独立公式用$$...$$格式(同样,可能不适用)。-LaTeX语法正确(但在这个上下文中,主要是文本)。-使用中文回答。-生成相关问题。-在引用的段落末尾添加引用标识,如[^1]。引用标识的使用:在回答中,当引用到提供的引用内容时,添加[^n]。回答结构:-**标题或概述**:直接回应问题。-**步骤指南**:分步解释配置过程。-**注意事项**:包括优化和常见问题。-**相关问题**:在结尾。生成相关问题:基于主题,如“如何优化LOV性能?”、“集的高级配置”等。参考引用内容:-引用[3]提到集附加列和$FLEX$.的使用,这很重要。-引用[4]是关于FORM中的LOV使用。配置LOV集通常在OracleEBS的应用开发员职责下,通过集定义表单。典型配置路径:1.导航到“应用开发员”职责。2.打开“集”表单。3.定义新集或修改现有集。4.设置集属性:如格式、验证类型(独立、表等)、SQL查询等。在回答中,整合引用:-提到使用$FLEX$.来调用参数[^3]。-优化LOV速度[^2]。-示例SQL[^1]。最终回答应以用户可见层格式呈现。</think>### Oracle EBS LOV集配置方法及使用指南 在Oracle E-Business Suite (EBS)中,LOV(List of Values,列表集是一种核心功能,用于在表单或报表中提供下拉列表或弹出选择框,帮助用户快速输入有效。配置LOV集主要涉及定义集、设置验证规则和优化性能。下面我将基于您的需求,逐步介绍配置方法、使用指南和相关注意事项。内容参考了Oracle EBS官方文档和常见实践,确保真实可靠。 #### 1. **LOV集的基本概念** - **作用**:LOV集用于限制用户输入,确保数据一致性,例如在采购订单或库存模块中,选择组织单位或产品代码。 - **核心组件**: - **集类型**:包括独立集(静态列表)、表集(基于SQL查询)、配对集等。 - **验证规则**:通过SQL或PL/SQL定义的范围和格式。 - 在配置中,经常使用$FLEX$.语法来动态引用其他参数,例如在SQL查询中调用集参数,如:$FLEX$.CUXINV_ORG[^3]。 #### 2. **配置LOV集的详细步骤** 配置通常在“应用开发员”职责下完成,以下是标准操作流程: **步骤1: 导航到集定义表单** - 登录EBS系统,切换到“应用开发员”职责。 - 路径:**导航器 > 应用开发员 > 应用 > 验证 > 集**。 - 这里可以创建、修改或删除集。 **步骤2: 创建新集** - 在“集”表单中,点击“新建”。 - 填写基本属性: - **集名称**:唯一标识符(如:XX_CUST_ORG_VS)。 - **描述**:简要说明用途(如:“客户组织LOV集”)。 - **格式类型**:选择数据类型(如:字符、数字)。 - **最大大小**:设置的最大度(如:30字符)。 - **验证类型**:关键配置项: - **独立**:手动输入列表(适合固定选项)。 - **表**:基于SQL查询动态获取(最常用)。在“表验证”部分,输入SQL查询,例如: ```sql SELECT hr.organization_id org_id, hr.name operating_unit FROM hr_operating_units hr WHERE po_moac_utils_pvt.check_access(hr.organization_id) = 'Y' ORDER BY operating_unit ``` 此查询从HR模块获取可访问的组织单位,并可用于LOV弹出列表[^1]。 - **配对**:用于键对场景(如:代码和描述)。 **步骤3: 设置附加列和参数** - 如果LOV需要显示额外信息(如组织代码和名称),在“附加列”部分配置: - 在SQL查询中添加列,并在“显示列”中指定。 - 使用$FLEX$.语法调用依赖参数,例如在查询中引用其他集: ```sql SELECT item_id, item_name FROM mtl_system_items WHERE organization_id = :$FLEX$.CUXINV_ORG ``` 这里:$FLEX$.CUXINV_ORG动态引用另一个集参数[^3]。 - **安全规则**:可选设置,限制集访问权限。 **步骤4: 在表单中绑定LOV集** - 打开表单开发工具(如Oracle Forms Builder)。 - 在块(Block)中选择需要LOV的项(Item),设置其“LOV属性”: - 指定集名称(如:XX_CUST_ORG_VS)。 - 使用PL/SQL代码触发LOV,例如在表单中添加按钮或事件: ```sql :parameter.G_query_find := 'TRUE'; app_find.find('your_block_name_here'); :parameter.G_query_find := 'FALSE'; ``` 此代码用于在用户查询时激活LOV[^4]。 - 测试:保存后编译表单,运行测试验证LOV是否正常弹出。 #### 3. **使用指南和最佳实践** - **日常使用**: - 在EBS表单中,用户可通过快捷键(如F9)或点击LOV图标触发列表。 - LOV支持搜索和过滤,提高数据输入效率。 - **优化性能**: - 如果LOV响应慢(出现Busy状态),优化SQL查询: - 避免复杂JOIN,使用索引字段。 - 限制返回行数(如添加ROWNUM条件)。 - 引用[2]提到,当数据量大时,优化查询可减少等待时间[^2]。 - 缓存常用集,减少数据库查询。 - **常见问题**: - **不显示**:检查SQL查询权限和语法错误,确保$FLEX$.参数正确绑定[^3]。 - **速度慢**:参考性能优化建议,或监控SQL执行计划。 - **安全**:集应遵循最小权限原则,防止未授权访问。 #### 4. **注意事项** - **权限要求**:配置集需“应用开发员”权限,普通用户仅能使用。 - **版本兼容**:不同EBS版本(如R12或12.2)界面略有差异,但核心逻辑相同。 - **文档支持**:Oracle提供详细集配置指南(Metalink文档ID 217489.1),建议查阅官方资源。 通过以上步骤,您可以高效配置和使用LOV集。如果需要进一步示例代码或调试,请提供具体场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值