【发布时间】:2017-03-02 17:34:11
【问题描述】:
我们在远程 Oracle 数据库中有一个 yuge 表,我主要使用它来将数据导出到我们的本地 sql server 数据库。只是为了给你一个想法,为了这篇文章的目的,我尝试做一个简单的行计数,但它在 10 分钟后没有返回值。
此表中的一列是日期时间类型(方便地称为DATETIME)。因此,例如,我的查询将获取从昨天到 8 天前的每一天的 SAUTO 和 SMAN 列的每日 SUM。
以下是我测试过的一些查询:
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 列使用了分区修剪,如果有帮助的话。
最后,我只有对该表的读取权限,所以请不要对表架构改进提出任何建议。你只会浪费时间和精力。
谢谢。
【问题讨论】:
标签: oracle performance plsql query-optimization