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这样的错误,其中一些数字设置不正确。