Sql Query执行时间比预期时间长

时间:2012-04-03 12:51:54

标签: sql

我正在尝试执行下面的查询,但这需要大约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的索引。

有人可以建议在这种情况下做什么。

3 个答案:

答案 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的信息 - 在其他客户端执行提交之前获得结果。