gpt4 book ai didi

sql - Oracle - 查询大型数据集需要很长时间 - 有没有办法优化它?

转载 作者:搜寻专家 更新时间:2023-10-30 22:12:41 24 4
gpt4 key购买 nike

假设我的 Oracle 数据库中有一个非常大的表,其中填充了数千个项目的数据。此数据会在一天中非常频繁地更新,并且每次更新都有一个时间戳。

因此,例如,表格如下所示(我知道列名不好,这只是示例):

每日待定:

Date:         ItemNo:     CharA:  ....  CharN:    Time_Stamp:
2014/02/15 123 .... 2014/02/15 10:00AM
2014/02/15 123 .... 2014/02/15 11:00AM
2014/02/15 123 .... 2014/02/15 02:13PM
2014/02/15 234 .... 2014/02/20 01:00PM
2014/02/15 234 .... 2014/02/20 09:00PM
...
2014/02/16 123 .... 2014/02/20 08:15PM
...

然后,我有一个包含相同项目编号的表,用于存储其他信息,但它在整个月内保持不变,因此它看起来如下:

TBLMonthly:

Date:          ItemNo:    CharA:   .... CharK:
2014/01/31 123 ....
2014/01/31 234 ....
2013/12/31 123 ....
2013/12/31 234 ....
...

现在,我需要为每个零件号和每个日期获取每日表中可用的最新信息,对于某些特性,如果它们不存在,则从每月表中获取它们。

我的 SQL 查询如下所示:

WITH All_Data AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY A.Date, A.ItemNo ORDER BY A.Time_Stamp) AS RN,
A.Date, A.ItemNo,
NVL(A.CharA, B.CharA),
B.CharB,
... whatever other characteristics ...

FROM
TBLDaily A,
TBLMonthly B,

WHERE
A.ItemNo = B.ItemNo
AND
A.Date BETWEEN To_Date('2012-12-31', 'yyyy-MM-dd') AND To_Date('2014-02-24', 'yyyy-MM-dd')
AND
B.Date = (SELECT max(Date) FROM TBLMonthly WHERE Date <= A.Date)
)

SELECT *
FROM All_Data
WHERE RN = 1
ORDER BY Date, ItemNo

现在,这个查询需要非常的时间才能完成(我从昨天下午开始让它运行,今天早上它仍在执行查询)。我知道它适用于一个非常大的数据集,但我查询更大的数据集的速度要快得多。我猜测这是由于:

  1. PARTITION BY
  2. 连续B.Date = (SELECT max(Date) FROM TBLMonthly WHERE Date <= A.Date)

但我不确定,更糟糕的是,我不知道如何修复它以使其更有效率并且不会花费这么长时间。

任何想法/帮助将不胜感激!!

最佳答案

使用这种方法也许您的查询会更容易、更快捷:

with t AS
(SELECT DISTINCT LAST_VALUE(CharA) OVER (PARTITION BY Date, ItemNo ORDER BY Time_Stamp) as CharA,
MAX(Time_Stamp) OVER (PARTITION BY Date, ItemNo) as Time_Stamp
FROM TBLDaily)
SELECT *
FROM t
JOIN TBLMonthly m ON m.ItemNo = d.ItemNo and t.Time_Stamp = m.Time_Stamp

关于sql - Oracle - 查询大型数据集需要很长时间 - 有没有办法优化它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22044749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com