一尘不染

优化Oracle查询

sql

SELECT MAX(verification_id)
  FROM VERIFICATION_TABLE
 WHERE head = 687422
   AND mbr = 23102
   AND RTRIM(LTRIM(lname)) = '.iq bzw'
   AND  TO_CHAR(dob,'MM/DD/YYYY')= '08/10/2004'
   AND system_code = 'M';

此查询需要153秒才能运行。中有数百万行VERIFICATION_TABLE

我认为查询要花很长时间,因为where子句中的功能。但是,我需要在列上执行ltrim
rtrim,而且日期也必须在MM/DD/YYYY格式上匹配。如何优化此查询?

说明计划:

SELECT STATEMENT, GOAL = ALL_ROWS           80604   1   59
 SORT AGGREGATE                                   1   59
  TABLE ACCESS FULL P181    VERIFICATION_TABLE  80604   1   59

首要的关键:

VRFTN_PK    Primary VERIFICATION_ID

索引:

N_VRFTN_IDX2    head, mbr, dob, lname, verification_id
N_VRFTN_IDX3    last_update_date
N_VRFTN_IDX4    mbr, lname, dob, verification_id
N_VRFTN_IDX4    verification_id

但是,在解释计划中,我看不到使用索引/主键。那是问题吗?


阅读 154

收藏
2021-03-08

共1个答案

一尘不染

试试这个:

SELECT MAX(verification_id)
  FROM VERIFICATION_TABLE
 WHERE head = 687422
   AND mbr = 23102
   AND TRIM(lname) = '.iq bzw'
   AND TRUNCATE(dob) = TO_DATE('08/10/2004')
   AND system_code = 'M';

TRUNCATE()如果dob尚无时间,请从其外观(出生日期?)上删除该对象。除此之外,您还需要一些索引工作。如果要查询那么多的这种风格,我会指数mbr,并head在2列索引,如果你说的是什么意思列它会在这里帮助确定最佳的索引。

2021-03-08