1

Windowsのファイルを外部デバイスにコピーするときのように、「クエリの実行にかかる時間」を伝えるknows or thinkスクリプトまたはスクリプトの誰かが、コピーにかかる時間のおおよその見積もりを提供します. 誰かが説明計画に基づいて作成することを考えることができますか?. ここがそのような質問をするのに適切なフォーラムかどうかはわかりませんが、この質問が頭に浮かんだので質問しました。toolrough estimatealgorithm

4

3 に答える 3

3

クエリ プランの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.

明らかに、オプティマイザーの見積もりは確かに正しくない可能性があります。しかし、これは通常、オブジェクトの統計が何らかの形で正しくないことを意味します。アルゴリズムが同じ統計を使用すると仮定すると、見積もりがはるかに正確になる可能性は低いと思われます。

于 2012-12-11T16:45:31.363 に答える
1

Oracle には、一部のクエリの完了時間を見積もる v$session_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 にはすべてのクエリが含まれているわけではありませんが、含まれる基準を満たす長時間実行クエリに関する興味深い情報を提供します。

于 2012-12-12T12:40:14.543 に答える
0

これには多くの要因があります。

このペーパーでは、探しているものについての洞察を得ることができます: ftp://ftp.research.microsoft.com/users/autoadmin/progress.pdf

于 2012-12-11T16:45:37.840 に答える