where子句筛选器谓词上的Oracle性能问题
对性能改进还不熟悉,我正在努力解决以下问题。下表用于跟踪加入者的状态。每次状态更改时,都会为加入者插入一个新行。我正在尝试为一个需要亚秒响应时间的web界面获取给定注册者的最大状态。我已经将自连接更改为使用秩和更新的索引,这确实很有帮助,但当我尝试添加where条件以查找给定的注册\u进程\u状态时,查询需要一秒钟的时间才能响应。对如何改进这一点有什么建议吗where子句筛选器谓词上的Oracle性能问题,oracle,performance,join,indexing,self,Oracle,Performance,Join,Indexing,Self,对性能改进还不熟悉,我正在努力解决以下问题。下表用于跟踪加入者的状态。每次状态更改时,都会为加入者插入一个新行。我正在尝试为一个需要亚秒响应时间的web界面获取给定注册者的最大状态。我已经将自连接更改为使用秩和更新的索引,这确实很有帮助,但当我尝试添加where条件以查找给定的注册\u进程\u状态时,查询需要一秒钟的时间才能响应。对如何改进这一点有什么建议吗 CREATE TABLE "TM"."ENRL_PROCESS_STATUS" ( "ENRL_ENROLLEE_RECO
CREATE TABLE "TM"."ENRL_PROCESS_STATUS"
( "ENRL_ENROLLEE_RECORD_SK" NUMBER(*,0) NOT NULL ENABLE,
"ENRL_PROCESS_STATUS_SK" NUMBER(*,0) NOT NULL ENABLE,
"ENROLLMENT_PROCESS_STATUS" NUMBER(*,0),
"BACKOUT_ID" NUMBER(*,0),
"CREATE_DTTM" TIMESTAMP (6),
"CREATE_LOGIN" VARCHAR2(50 BYTE),
"UPDATE_DTTM" TIMESTAMP (6),
"UPDATE_LOGIN" VARCHAR2(50 BYTE),
"PROCESS_STATUS_REASON_CD" NUMBER(*,0),
CONSTRAINT "ENRL_PROCESS_STATUS_PK" PRIMARY KEY ("ENRL_PROCESS_STATUS_SK")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "ENRL_PROCESS_STATUS_FK1" FOREIGN KEY ("ENRL_ENROLLEE_RECORD_SK")
REFERENCES "TM"."ENRL_ENROLLEE_RECORD" ("ENRL_ENROLLEE_RECORD_SK") ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
CREATE INDEX "TM"."TOM1" ON "TM"."ENRL_PROCESS_STATUS" ("ENRL_ENROLLEE_RECORD_SK", "CREATE_DTTM" DESC, "ENROLLMENT_PROCESS_STATUS", "PROCESS_STATUS_REASON_CD")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
SQL来标识加入者的最新状态
如果没有条件,查询将在0秒内运行,并执行以下解释计划
使用和条件时,查询运行时间超过1.2秒,并执行以下解释计划。关于如何提高这方面的性能,有什么想法吗
为什么在分区上使用rank by,然后使用seqnum=1,为什么不使用ROWNUM?这将大大提高您的查询性能?@Spidey-您打算如何使用ROWNUM来获取每个注册者的最新状态?抱歉,我阅读了SQL来识别问题中注册者的最新状态。那样的话,你的桌子设计正确吗?您正在将所有更改放在一个表中,例如审计跟踪或日志记录,并且也使用它们来标识最新记录,而不需要任何其他信息。我建议1]将其拆分为2个表,1个具有当前状态,另一个具有所有状态触发器,可用于更新此表,或2]添加一个额外的列,该列将唯一标识当前注册状态,并将其用作筛选器。感谢您的反馈。我们正在考虑更改表,但有多个进程写入现有结构,因此不希望必须修正所有组件。我们的环境不支持使用触发器,因此我们不能选择使用触发器。我希望SQL或索引更改可以解决性能问题。
SELECT enrl_enrollee_record_sk, enrollment_process_status, PROCESS_STATUS_REASON_CD
FROM
(
SELECT
enrl_enrollee_record_sk, enrollment_process_status, PROCESS_STATUS_REASON_CD,
rank() over (partition by enrl_enrollee_record_sk ORDER BY CREATE_DTTM DESC) as seqnum
FROM TM.enrl_process_status ps
) A
WHERE seqnum = 1
AND (ENROLLMENT_PROCESS_STATUS IN (3,4,5,8) OR (ENROLLMENT_PROCESS_STATUS = 10 AND PROCESS_STATUS_REASON_CD in (1,3)))
Plan hash value: 2893856400
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3420K| 169M| 7592 (1)| 00:01:47 |
|* 1 | VIEW | | 3420K| 169M| 7592 (1)| 00:01:47 |
|* 2 | WINDOW NOSORT | | 3420K| 71M| 7592 (1)| 00:01:47 |
| 3 | INDEX FULL SCAN| TOM1 | 3420K| 71M| 7592 (1)| 00:01:47 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("SEQNUM"=1)
2 - filter(RANK() OVER ( PARTITION BY "ENRL_ENROLLEE_RECORD_SK"
ORDER BY SYS_OP_DESCEND("CREATE_DTTM"))<=1)
Plan hash value: 2893856400
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3420K| 169M| 7592 (1)| 00:01:47 |
|* 1 | VIEW | | 3420K| 169M| 7592 (1)| 00:01:47 |
|* 2 | WINDOW NOSORT | | 3420K| 71M| 7592 (1)| 00:01:47 |
| 3 | INDEX FULL SCAN| TOM1 | 3420K| 71M| 7592 (1)| 00:01:47 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("SEQNUM"=1 AND (("ENROLLMENT_PROCESS_STATUS"=3 OR
"ENROLLMENT_PROCESS_STATUS"=4 OR "ENROLLMENT_PROCESS_STATUS"=5 OR
"ENROLLMENT_PROCESS_STATUS"=8) OR "ENROLLMENT_PROCESS_STATUS"=10 AND
("PROCESS_STATUS_REASON_CD"=1 OR "PROCESS_STATUS_REASON_CD"=3)))
2 - filter(RANK() OVER ( PARTITION BY "ENRL_ENROLLEE_RECORD_SK"
ORDER BY SYS_OP_DESCEND("CREATE_DTTM"))<=1)