Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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
Sql 如何提高where子句使用max()子查询的视图的性能?_Sql_Oracle - Fatal编程技术网

Sql 如何提高where子句使用max()子查询的视图的性能?

Sql 如何提高where子句使用max()子查询的视图的性能?,sql,oracle,Sql,Oracle,我有以下观点,用于检查每个代理商每年的销售额: SELECT C.SUBSIDIARY_ID AS SUBSIDIARY_ID, SUM(CI.CURRENT_VALUE) AS TOTAL_SALES, C.AGENT_USERNAME AS AGENT, TO_CHAR(C.SIGN_DATE, 'YYYY') AS SIGN_YEAR FROM CONTRACT_INFO CI INNER JOIN CONTRACT C ON C.ID =

我有以下观点,用于检查每个代理商每年的销售额:

SELECT C.SUBSIDIARY_ID AS SUBSIDIARY_ID,
       SUM(CI.CURRENT_VALUE) AS TOTAL_SALES,
       C.AGENT_USERNAME AS AGENT,
       TO_CHAR(C.SIGN_DATE, 'YYYY') AS SIGN_YEAR
  FROM CONTRACT_INFO CI
 INNER JOIN CONTRACT C ON C.ID = CI.CONTRACT_ID
 WHERE CI.UPDATE_DATE = (SELECT MAX(CI2.UPDATE_DATE) 
                        FROM CONTRACT_INFO CI2 
                       WHERE CI.CONTRACT_ID = CI2.CONTRACT_ID)
 GROUP BY SUBS.NAME, C.SUBSIDIARY_ID, C.AGENT_USERNAME, TO_CHAR(C.SIGN_DATE, 'YYYY');
此视图由一个应用程序查询,该应用程序可能按签名年份子公司ID和/或代理

合同信息表不断更新新的重新协商值和其他内容,因此我们需要最大更新日期来获取最新值

当我们通过签名年份和/或子公司ID进行查询时,一切正常。当代理查询时,执行查询需要5分钟以上的时间

每个表都包含30多列,签名年份子公司ID代理都在它们的表中索引,我不能使用ID代替代理的用户名,原因是(代理用户名的预期值:'john.doe')


当由代理查询时,如何提高性能?

对于您编写的查询,您希望在
联系人信息(合同id、更新日期)

但是,还有其他方法可以编写查询。使用相同的索引,您可以尝试:

SELECT C.SUBSIDIARY_ID AS SUBSIDIARY_ID,
       SUM(CI.CURRENT_VALUE) AS TOTAL_SALES,
       C.AGENT_USERNAME AS AGENT,
       TO_CHAR(C.SIGN_DATE, 'YYYY') AS SIGN_YEAR
FROM CONTRACT C JOIN
     (SELECT CI.*,
             ROW_NUMBER() OVER (PARTITION BY CONTRACT_ID ORDER BY UPDATE_DATE DESC) as SEQNUM
      FROM CONTRACT_INFO CI
     ) CI
     ON C.ID = CI.CONTRACT_ID
WHERE seqnum = 1
GROUP BY SUBS.NAME, C.SUBSIDIARY_ID, C.AGENT_USERNAME, TO_CHAR(C.SIGN_DATE, 'YYYY');

非常感谢,在一个特殊情况下,执行时间从190秒以上下降到0.27秒,只需稍加更正:
ROW_NUMBER()(按合同ID划分,更新日期描述)as SEQNUM
应该
ROW_NUMBER()(按合同ID划分,按更新日期描述排序)如SEQNUM所示,如果其他人正在寻找类似的内容,只需添加索引即可将相同的查询时间提高到0.7秒。@gp88。改善了99.7%。很不错的。