在oracle中有没有办法确定sql查询获取整个记录需要多长时间以及它的大小,而不是实际执行并等待整个结果。
我反复下载并使用普通的oracle SQL select(不是datapump / import等)向用户提供数据。有时行数将达到数百万。
答案 0 :(得分:2)
除非您运行实际运行时间,否则将无法知道,但您可以尝试估算它..
基于此,您可以尝试估计时间
答案 1 :(得分:2)
这需要良好的统计信息,explain plan for ...
,调整sys.aux_stats
,然后调整您的期望。
良好的统计数据解释计划估算值基于优化程序统计信息。确保表和索引具有最新统计信息。在11g上,这通常意味着坚持使用默认设置和任务,并且仅在大数据加载后手动收集统计信息。
Explain plan for ...
使用这样的语句为任何SQL语句创建和存储解释计划。这甚至适用于创建索引和表。
explain plan set statement_id = 'SOME_UNIQUE_STRING' for
select * from dba_tables cross join dba_tables;
这通常是可视化解释计划的最佳方式:
select * from table(dbms_xplan.display);
Plan hash value: 2788227900
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12M| 5452M| 00:00:19 |
|* 1 | HASH JOIN RIGHT OUTER | | 12M| 5452M| 00:00:19 |
| 2 | TABLE ACCESS FULL | SEG$ | 7116 | 319K| 00:00:01 |
...
原始数据存储在PLAN_TABLE
中。计划的第一行通常总结其他步骤的估计值:
select cardinality, bytes, time
from plan_table
where statement_id = 'SOME_UNIQUE_STRING'
and id = 0;
CARDINALITY BYTES TIME
12934699 5717136958 19
调整sys.aux_stats $ 时间估算基于sys.aux_stats
中存储的系统统计信息。这些是CPU速度,单块I / O读取时间等指标的数字。例如,在我的系统上:
select * from sys.aux_stats$ order by sname
SNAME PNAME PVAL1 PVAL2
SYSSTATS_INFO DSTART 09-11-2014 11:18
SYSSTATS_INFO DSTOP 09-11-2014 11:18
SYSSTATS_INFO FLAGS 1
SYSSTATS_INFO STATUS COMPLETED
SYSSTATS_MAIN CPUSPEED
SYSSTATS_MAIN CPUSPEEDNW 3201.10192837466
SYSSTATS_MAIN IOSEEKTIM 10
SYSSTATS_MAIN IOTFRSPEED 4096
SYSSTATS_MAIN MAXTHR
SYSSTATS_MAIN MBRC
SYSSTATS_MAIN MREADTIM
SYSSTATS_MAIN SLAVETHR
SYSSTATS_MAIN SREADTIM
dbms_stats.gather_system_stats
可自动收集这些数字。它们也可以手动修改。它是一个SYS表,但修改起来相对安全。创建一些示例查询,将估计的时间与实际时间进行比较,并调整数字直到它们匹配。
发现你可能浪费了很多时间
在所有情况下,预测运行时间在理论上是不可能的,并且在实践中,非常难以预测非平凡的查询。乔纳森·刘易斯(Jonathan Lewis)写了一篇关于这些预测的全文book,而这本书只涵盖了基础知识"。
复杂的解释计划通常足够好"如果估计数减少了一个或两个数量级。但是,这种差异通常不足以向用户展示,或用于做出任何重要决定。