Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
where子句筛选器谓词上的Oracle性能问题_Oracle_Performance_Join_Indexing_Self - Fatal编程技术网

where子句筛选器谓词上的Oracle性能问题

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

对性能改进还不熟悉,我正在努力解决以下问题。下表用于跟踪加入者的状态。每次状态更改时,都会为加入者插入一个新行。我正在尝试为一个需要亚秒响应时间的web界面获取给定注册者的最大状态。我已经将自连接更改为使用秩和更新的索引,这确实很有帮助,但当我尝试添加where条件以查找给定的注册\u进程\u状态时,查询需要一秒钟的时间才能响应。对如何改进这一点有什么建议吗

 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)