Oracle 查询查找记录的处理时间超过 24 小时
Posted
技术标签:
【中文标题】Oracle 查询查找记录的处理时间超过 24 小时【英文标题】:Oracle query to find records took more than 24hrs to process 【发布时间】:2020-04-06 14:49:21 【问题描述】:我遇到的情况是,我必须从在 DW 中两次加载超过 24 小时的表中找出此类记录。
所以为此我有两张桌子
-
表 1 :- 其中包含有关每个负载的统计信息
表 2:- 其中包含有关我们何时收到要加载的每个文件的统计信息
现在我只想要那些加载时间超过 24 小时的记录。 我收到文件的日期在表 2 中,而当它的加载完成时在表 1 中,因此 table2 的每个文件可能有多个条目。
我开发了以下查询,但需要更多时间
SELECT
rcd.file_date,
rcd.recived_on as "Date received On",
rcd.loaded_On "Date Processed On",
to_char(rcd.recived_on,'DY') as "Day",
round((rcd.loaded_On - rcd.recived_on)*24,2) as "time required"
FROM (
SELECT
tbl1.file_date,
(SELECT tbl2.recived_on
FROM ( SELECT recived_on
FROM table2
Where fileName = tbl1.feedName
order by recived_on) tbl2
WHERE rownum = 1) recived_on,
tbl1.loaded_On,
to_char(tbl2.recived_on,'DY'),
round((tbl1.loaded_On - tbl2.recived_on)*24,2)
FROM Table1 tbl1 ,
Table1 tbl2
WHERE
tbl1.id=tbl2.id
AND tbl1.FileState = 'Success'
AND trunc(loaded_On) between '25-Feb-2020' AND '03-Mar-2020'
) rcd
WHERE (rcd.loaded_On - rcd.recived_on)*24 > 24;
【问题讨论】:
您的具体问题是什么? 首先,连接两个表时应该使用现代JOIN
语法。
@ErgiNushi - 不管你个人觉得隐式连接语法多么烦人,它在这里的使用与问题无关。
【参考方案1】:
我认为您的很多问题很可能源于您在内部查询的列列表中使用了子查询。也许尝试使用分析函数。像这样的:
SELECT rcd.file_date,
rcd.recived_on AS "Date received On",
rcd.loaded_On "Date Processed On",
to_char(rcd.recived_on, 'DY') AS "Day",
round((rcd.loaded_On - rcd.recived_on) * 24, 2) AS "time required"
FROM (SELECT tbl1.file_date,
MIN(tbl2.recived_on) OVER (PARTITION BY tbl2.filename) AS recived_on,
tbl1.loaded_On
FROM Table1 tbl1
INNER JOIN Table1 tbl2 ON tbl1.id = tbl2.id
WHERE tbl1.FileState = 'Success'
AND trunc(loaded_On) BETWEEN '25-Feb-2020' AND '03-Mar-2020') rcd
WHERE (rcd.loaded_On - rcd.recived_on) * 24 > 24;
另外,您在内部查询中选择了一些列并且没有使用它们,所以我删除了它们。
【讨论】:
以上是关于Oracle 查询查找记录的处理时间超过 24 小时的主要内容,如果未能解决你的问题,请参考以下文章
如何在 postgresql 中进行查询,以查找所有启动时间超过 6 小时的记录?
如何在 Oracle 中查找 SQL 查询中返回的记录的内存大小?
Oracle查询优化改写--------------------单表查询
如果在单个请求中与 Oracle 和 PostgreSql 交互以处理超过 20 万条记录,如何提高 EF Core 性能