我正在尝试执行下面的查询,但这需要大约40分钟。
select logentryid
from (
select * from logentry_payloaddata pd,
logentry le
where (
pd.entryid=le.logentryid
and
le.eventdatetime=(trunc(sysdate) - 14)
)
order by le.logentryid asc
)
在表格中有4,24,91,461个记录,在logentry有效载荷数据中有4,15,16,346个记录(或“42,491,461”和“41,516,346”在世界某些地区,甚至“42.491.461”和其他一些部分的“41.516.346” - Ed。)
在resp表中有logentryid和entryid的索引。
有人可以建议在这种情况下做什么。
答案 0 :(得分:3)
一些建议:
1 - 如果指数eventdatetime
尚未
2 - 为(trunc(sysdate) - 14)
定义变量 - 这将阻止函数为每一行运行,并允许使用第1步中的索引
3 - 取消混淆代码。这里不需要嵌套,并且您使用的是旧式JOIN
语法,这可能会导致问题:
SELECT logentryid
FROM logentry_payloaddata pd
INNER JOIN logentry le
ON pd.entryid=le.logentryid
WHERE le.eventdatetime = @MyDateVariable
ORDER BY logentryid ASC
答案 1 :(得分:2)
SELECT
le.logentryid
FROM
logentry_payloaddata pd
INNER JOIN
logentry le
ON pd.entryid=le.logentryid
WHERE
le.eventdatetime = CAST(trunc(sysdate) - 14 AS DATETIME)
ORDER BY
le.logentryid ASC
1)。为了我的利益,更改了布局(使用INNER JOIN等),但怀疑它会改变性能。
2)。在您的日期比较中添加了CAST()
。您的代码需要隐式 CAST()
。使用显式 CAST()
可确保正在转换常量,而不是数据字段。这很重要,因为它决定了如何使用或不能使用任何索引。
3)。索引 - 没有单一的答案,这取决于您的数据的统计数据。
在表格logentry_payloaddata
上,您肯定需要entryid
上的索引。
在表logentry
上,有两个不同的索引可能会有所帮助:
- (logentryid, eventdatetime)
- (eventdatetime, logentryid)
我最好的猜测是,后者将提供最佳表现。但我建议创建两个并检查实际使用的是哪个。
答案 2 :(得分:0)
尝试:
select logentryid
from logentry_payloaddata pd
inner join logentry le on pd.entryid=le.logentryid and le.eventdatetime=(trunc(sysdate) - 14)
您可以将where子句放在内连接上,以便更快地进行比较。
如果您的数据库同时被多个客户端访问/更新,也值得尝试使用nolock。请先阅读有关使用nolock的信息 - 在其他客户端执行提交之前获得结果。