【问题标题】:SQL - Optimize date calculation for large tableSQL - 优化大表的日期计算
【发布时间】:2012-07-26 08:00:09
【问题描述】:

下面这个查询可以优化吗?

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 秒

在这种特殊情况下,表有大约 17,000,000 个条目。

有没有更优化的方法来重写这个?

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

第一个查询,无索引:~0.56 秒,有索引:~0.2 秒。第二个查询,无索引:~0.41 秒,有索引:~0.005 秒。 (这让我很惊讶,我认为第一个查询会比第二个查询运行得更快,也许它更适合较小的记录集)。

我向 DBA 建议了这个解决方案,他将更改表结构以适应此问题,然后我将使用实际数据对其进行测试。谢谢

【问题讨论】:

  • date是表中的字段吗?
  • 这总是需要全表扫描,我看不出有任何优化方法。

标签: sql oracle query-optimization


【解决方案1】:

日期列有索引吗?

【讨论】:

  • 索引列可以让您更快地找到最大值/最小值
  • @joeygs 您是否能够添加索引,或者您是否处于非常受限的环境中?还有其他提高性能的选项,但除非您无法创建索引,否则不值得探索。
  • @jonearles 我无法在生产数据库上添加索引,我正在检查开发数据库中的索引解决方法。如果这不起作用,还有哪些其他选项?跨度>
  • @joeygs 我不相信您可以对 SQL 做任何事情来改进查询。您的选择几乎是索引日期列或购买新硬件。不过,索引应该绰绰有余:)
  • 您可以尝试并行、压缩、pctfree 0、物化视图、alter table table_name shrink space、函数结果缓存或查询结果缓存。每个都有明显的缺点,而且可能甚至没有太大帮助。如果可以的话,绝对使用索引。
【解决方案2】:

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

【讨论】:

  • 这是一个oracle数据库,在PL/SQL中,SYSDATE是一个总是返回OS当前日期时间值的函数
  • @joeygs:尝试在date 上添加索引并检查相同查询的时间。
  • 虽然我无法在生产数据库上添加索引,但我将在开发数据库中测试此解决方案,但使用一小部分数据来检查性能
猜你喜欢
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2017-01-07
  • 1970-01-01
  • 2011-03-18
相关资源
最近更新 更多