比较PLSQL中日期时间的更有效方法?

时间:2017-03-02 17:34:12

标签: oracle performance plsql query-optimization

我们在远程Oracle数据库中有一个 yuge 表,主要用于将数据导出到本地sql server数据库。只是为了给你一个想法,我尝试为这篇文章做一个简单的行计数,它在10分钟后没有返回值。

此表中的一列是datetime类型(方便地称为DATETIME)。因此,我的查询将在昨天和8天之前的每一天获得每天SUMSAUTOSMAN

这些是我测试的一些查询:

SELECT trunc(datetime)
  ,TransId
  ,sum(SAUTO)
  ,sum(SMAN)
  ,count(TransId)
  FROM MyTable
  WHERE     
  and trunc(DATETIME) >= trunc(sysdate)-8
  and trunc(DATETIME) < trunc(sysdate)
  group by trunc(DATETIME), TransId

SELECT 
CAST( to_char(DATETIME,'YYYYMMDD') AS int )
,TransId
,sum(SAUTO)
,sum(SMAN)
,count(TransId)
FROM MyTable
WHERE     
CAST( to_char(DATETIME,'YYYYMMDD') AS int ) >= CAST( to_char(sysdate,'YYYYMMDD') AS int ) - 8
and CAST( to_char(DATETIME,'YYYYMMDD') AS int ) < CAST( to_char(sysdate,'YYYYMMDD') AS int )
group by CAST( to_char(DATETIME,'YYYYMMDD') AS int ), TransId

两个返回数据(尽管后者要慢得多),但必须有一种更有效的方法来检查它。此外,DBA告诉我,列DATETIME使用分区修剪,如果这有助于任何。

最后,我只对该表有读访问权限,所以请不要对表模式改进提出任何建议。你只会浪费时间和精力。

感谢。

1 个答案:

答案 0 :(得分:2)

  

&#34; DBA告诉我,DATETIME列使用分区修剪&#34;

因此表格由DATETIME分区。在这种情况下,在WHERE子句中截断该列是一个非常糟糕的主意,因为这将禁用分区修剪(分区键为DATETIME而不是trunc(DATETIME)

所以这对你来说应该更快:

  SELECT trunc(datetime)
       ,TransId
       ,sum(SAUTO)
       ,sum(SMAN)
       ,count(TransId)
  FROM MyTable
  WHERE DATETIME >= trunc(sysdate)-8
  and DATETIME < trunc(sysdate)
  group by trunc(DATETIME), TransId