2012-07-27 112 views
4

下面的查询可以优化吗?SQL - 为大表优化日期计算

select 
    max(date), sysdate - max(date) 
from 
    table; 

查询执行时间〜5.7秒

我有另一种方法

select 
    date, sysdate - date 
from 
    (select * from table order by date desc) 
where 
    rownum = 1; 

查询执行〜7.9秒

在这种特殊情况下,表中有大约1700万项。

有没有更好的方法来重写呢?

更新:好吧,我尝试了一些你在数据库开发中建议的提示,尽管它的子集比原来的(约1,000,000条记录)要小。没有索引,查询运行速度比索引慢。

第一个查询,没有索引:〜0.56秒,索引:〜0.2秒。第二个查询,没有索引:〜0.41秒,索引:〜0.005秒。 (这让我感到吃惊,我认为第一个查询会比第二个查询更快,也许它更适合更小的记录集)。

我建议DBA这个解决方案,他会改变表结构以适应这种情况,然后我会用实际数据测试它。谢谢

+0

'date'是表中的一个字段吗? – wallyk 2012-07-27 15:44:30

+0

这将始终需要全表扫描,我没有看到任何方式来优化它。 – 2012-07-27 15:47:27

+0

@wallyk是的,它是! – joeygs 2012-07-27 15:57:12

回答

3

日期栏是否有索引?

+0

不,没有 – joeygs 2012-07-27 16:04:55

+1

对列进行索引可以让您更快地找到最大/最小值 – 2012-07-27 19:51:37

+0

@joeygs您是否可以添加索引,或者您是否处于非常有限的环境中?还有其他选项可以提高性能,但除非无法创建索引,否则不值得探索。 – 2012-07-28 03:44:50

1

该查询非常简单,除了在日期列上添加索引之外,可能无法对其进行优化。这是什么数据库? sysdate是表的另一列吗?

+0

这是一个oracle数据库,在PL/SQL中,SYSDATE是一个函数,它总是返回OS当前的日期时间值 – joeygs 2012-07-27 15:55:34

+0

@joeygs:尝试添加一个索引'date'并检查相同查询的时间。 – wallyk 2012-07-27 17:20:35

+0

虽然我无法在生产数据库中添加索引,但我会在开发数据库中测试此解决方案,但仅使用一小部分数据来检查性能 – joeygs 2012-07-30 13:47:28