Database 在查询之前查找大致时间的算法
是否有人Database 在查询之前查找大致时间的算法,database,oracle,Database,Oracle,是否有人知道或想到一个脚本或工具,它会告诉粗略估计“执行查询需要多长时间”,比如当我们将windows中的文件复制到某个外部设备时,它会给出复制所需时间的粗略估计。 有人能想到根据解释计划创建任何算法吗?。 我不知道这是否是提出此类问题的合适论坛。但这个问题出现在我的脑海中,所以我问了。查询计划的时间列已经为您提供了优化器对所用时间的估计 SQL> select * 2 from table( dbms_xplan.display ); PLAN_TABLE_OUTPUT --
知道或想到一个脚本或工具
,它会告诉粗略估计
“执行查询需要多长时间”,比如当我们将windows中的文件复制到某个外部设备时,它会给出复制所需时间的粗略估计。
有人能想到根据解释计划创建任何算法吗?。
我不知道这是否是提出此类问题的合适论坛。但这个问题出现在我的脑海中,所以我问了。查询计划的时间
列已经为您提供了优化器对所用时间的估计
SQL> select *
2 from table( dbms_xplan.display );
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 546 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 546 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
8 rows selected.
显然,优化器的估计肯定是不正确的。但这通常意味着这些对象的统计数据在某种程度上是不正确的。假设您的算法将使用相同的统计数据,那么您的估计似乎不太可能更加准确。查询计划的TIME
列已经为您提供了优化器对所用时间的估计
SQL> select *
2 from table( dbms_xplan.display );
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 546 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 546 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
8 rows selected.
显然,优化器的估计肯定是不正确的。但这通常意味着这些对象的统计数据在某种程度上是不正确的。假设您的算法将使用相同的统计数据,您的估计似乎不太可能更加准确。这其中有很多因素
这篇文章可能会让你对你正在寻找的东西有所了解:
这其中有很多因素
这篇文章可能会让你对你正在寻找的东西有所了解:
Oracle有v$session\u longops视图,可以估计某些查询的完成时间。Longops包含以下信息:表扫描;索引快速全扫描;散列连接;排序/合并;排序输出;回降;收集表的索引统计信息。[但不是嵌套循环]
例如,您可以按如下方式进行查询:
select to_char(sysdate,'DD-MON-YYYY hh24:MI:SS') date_measured
, sql_id
, elapsed
, remaining
, ROUND(sofar/totalwork*100, 2) progress_pct
, username
, sql_text
, inst_id, sid, serial#
, logon_time
, OSUSER
, terminal
, machine
, program
, last_call_et
from
(
SELECT s.inst_id
,s.sid
,s.serial#
,s.username
,s.OSUSER
,s.machine
,s.sql_id
,TRUNC(sl.elapsed_seconds/60) || ':' || MOD(sl.elapsed_seconds,60) elapsed
,TRUNC(sl.time_remaining/60) || ':' || MOD(sl.time_remaining,60) remaining
, sl.sofar
, sl.totalwork
,s.logon_time
,s.terminal
,s.program
,s.last_call_et
,sa.sql_text
FROM gv$session s
,gv$session_longops sl
,gv$sqlarea sa
WHERE s.inst_id = sl.inst_id
AND s.sid = sl.sid
AND s.serial# = sl.serial#
and s.sql_id = sa.sql_id
and s.inst_id = sa.inst_id
) a
where remaining not in ('0:0',':')
;
同样,longops中并没有所有的查询,但它为满足其包含标准的长时间运行的查询提供了有趣的信息。Oracle有v$session\u longops视图,可以估计某些查询的完成时间。Longops包含以下信息:表扫描;索引快速全扫描;散列连接;排序/合并;排序输出;回降;收集表的索引统计信息。[但不是嵌套循环]
例如,您可以按如下方式进行查询:
select to_char(sysdate,'DD-MON-YYYY hh24:MI:SS') date_measured
, sql_id
, elapsed
, remaining
, ROUND(sofar/totalwork*100, 2) progress_pct
, username
, sql_text
, inst_id, sid, serial#
, logon_time
, OSUSER
, terminal
, machine
, program
, last_call_et
from
(
SELECT s.inst_id
,s.sid
,s.serial#
,s.username
,s.OSUSER
,s.machine
,s.sql_id
,TRUNC(sl.elapsed_seconds/60) || ':' || MOD(sl.elapsed_seconds,60) elapsed
,TRUNC(sl.time_remaining/60) || ':' || MOD(sl.time_remaining,60) remaining
, sl.sofar
, sl.totalwork
,s.logon_time
,s.terminal
,s.program
,s.last_call_et
,sa.sql_text
FROM gv$session s
,gv$session_longops sl
,gv$sqlarea sa
WHERE s.inst_id = sl.inst_id
AND s.sid = sl.sid
AND s.serial# = sl.serial#
and s.sql_id = sa.sql_id
and s.inst_id = sa.inst_id
) a
where remaining not in ('0:0',':')
;
同样,longops中没有所有查询,但它为满足其包含条件的长时间运行的查询提供了有趣的信息。我不希望它与windows复制文件时的状态相同。估计的时间总是相差很远:)@VishalKumar:不是这样,只是一个算法读取解释计划并提前告诉粗略的估计时间。所以我在心里准备好了,这需要花费这么多时间。我不希望它像windows复制文件时的状态一样。估计的时间总是相差很远:)@VishalKumar:不是那样的,只是一个算法阅读解释计划并提前告诉粗略的估计时间。所以我在心理上做好了准备,要花这么多时间。@Guarav你应该考虑跑步。这可能有助于改进时间估计。但是,如果您不使用11.2.0.3,您必须注意像9842771这样的错误,其中一些数字设置不正确。@Guarav您应该注意运行。这可能有助于改进时间估计。但是如果你不使用11.2.0.3,你必须注意像9842771这样的错误,其中一些数字设置不正确。