plsql - 优化oracle中的字符串搜索

标签 plsql oracle11g query-tuning

我有一个包含与员工相关的所有数据的 View 。 它有大约 350k 条记录。 我必须制作一个名称搜索功能。 这将检索与输入的关键字匹配的所有数据。

查询性能非常慢,需要 15-20 秒才能检索数据。 成本-15000

我的查询:

 SELECT            H.PERSON_ID,
                   B.EMPLOYEE_ID,
                   INITCAP(B.FIRST_NAME) EMP_FNAME,
                   INITCAP(B.MIDDLE_NAME) EMP_MNAME,
                   INITCAP(B.LAST_NAME) EMP_LNAME,
                   B.EMPLOYEE_TYPE PERSON_DESC,
                   B.EMPLOYMENT_STATUS STATUS_TYPE,
                   EA.BASE_BRANCH

              FROM EMPLOYEE_BASIC_DTLS   B,
                   EMP_ASSIGNMENT_DTLS_MV EA,
                   EMPLOYEE_HIS_DEPNDENT_TBL  H
             WHERE B.PERSON_ID = EA.PERSON_ID
               AND B.PERSON_ID = H.PERSON_ID
               AND ((UPPER(B.FIRST_NAME) LIKE
                   ('%' || V_SEARCH_PARAM1 || '%')) OR
                   (UPPER(B.MIDDLE_NAME) LIKE
                   ('%' || V_SEARCH_PARAM1 || '%')) OR
                   (UPPER(B.LAST_NAME) LIKE
                   ('%' || V_SEARCH_PARAM1 || '%')))
               AND TRUNC(SYSDATE) BETWEEN EA.EFFECTIVE_START_DATE AND
                   EA.EFFECTIVE_END_DATE
               AND UPPER(H.RELATIONSHIP_CODE) = 'A';

由于 EMPLOYEE_BASIC_DTLS 是一个 View ,我无法使用索引。

最佳答案

虽然您确实无法在 View 上放置索引,但您当然可以在基础表上放置索引。但是,正如 @JustinCave 所指出的,即使您确实向相应的表添加了索引,该查询仍然不会使用它们,因为使用了 LIKE。此外,由于 UPPER 函数应用于您需要的 FIRST_NAMEMIDDLE_NAMELAST_NAME 列将索引定义为基于函数的索引。例如,如果 EMPLOYEE_BASIC_TABLE View 访问的“真实”表称为 EMPLOYEES,您可以在 FIRST_NAME 列上定义基于函数的索引作为

CREATE INDEX EMPLOYEES_UPPER_FIRST_NAME ON EMPLOYEES (UPPER(FIRST_NAME));

我建议您考虑是否真的需要 LIKE 比较,因为解决这些问题以获得更好的性能将会很困难。

如果您想研究 Oracle Text 索引,您可以找到文档 here 。我想您会发现它更适合文档或文档片段索引,但也许它会给您一些想法。

分享并享受。

关于plsql - 优化oracle中的字符串搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18622559/

相关文章:

google-bigquery - 查询调优 Bigquery

Mysql查询非常慢并且没有使用正确的索引(通过使用group by、IN运算符)

java - JdbcTemplate.excute -spring- 不与 plsql 一起使用

oracle - 我的长时间 SQL*Plus 循环在执行期间不打印 DBMS_OUTPUT.PUT_LINE 输出

sql - 是否建议在 Oracle EBS 并发程序中提交一个 Commit?

sql - 如何重新键入表中的层次结构?

oracle11g - 以数字开头的 Oracle 用户名是否存在问题? - 引号中的用户名

带有 PARALLEL 提示的 SQL 查询分配的进程比指定的多得多

java - 找不到 rsadapterspi.jar 来使用 WSJdbcConnection

sql - SQL中Join语句的性能