0

巨大な Oracle Trace ファイルがあります。このファイルを作成したアプリケーションは、1 時間 15 分実行されました。この Tracefile では、1 時間強の実行時間で 4 つの Select が見つかりました。問題は、これらの選択がオプティマイザーによってサンプリングされることです。

SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE 
  NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false') 
  NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),:"SYS_B_00"), 
  NVL(SUM(C2),:"SYS_B_01") 
FROM
 (SELECT /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("LST_G") FULL("LST_G") 
  NO_PARALLEL_INDEX("LST_G") */ :"SYS_B_02" AS C1, CASE WHEN 
  "LST_G"."SENDUNG_TIX"=:"SYS_B_03" AND "LST_G"."LST_K"=:"SYS_B_04" AND 
  "LST_G"."LST_ART"=:"SYS_B_05" AND "LST_G"."FAK_TIX"=(-:"SYS_B_06") THEN 
  :"SYS_B_07" ELSE :"SYS_B_08" END AS C2 FROM "TMS1033"."LST_G" SAMPLE BLOCK 
  (:"SYS_B_09" , :"SYS_B_10") SEED (:"SYS_B_11") "LST_G") SAMPLESUB


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse    56076      3.93       4.21          0          0          0           0
Execute  56076      1.98       1.80          0          0          0           0
Fetch    56076   1127.54    1122.77        222   46487004          0       56076
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total   168228   1133.45    1128.79        222   46487004          0       56076

これは4つのうちの1つで、見た目はほとんど同じです。元のステートメントを見つけたと思いますが、これらは Uniface サービスから実行されます。Uniface がどのように機能するのかわかりません。私はただのデータベース担当者です。問題は、オプティマイザーがこのステートメントを再構築する理由がわからないことです。dynamic_sample元のものはヒントを使用しません。また、元のステートメントもトレース ファイルに追加されていることがわかりました。

select count(*) 
from
 lst_g where sendung_tix = 10330805990396 and lst_k = 'E' and lst_art = 'G' 
  and fak_tix = -4

そのため、これらのサンプルステートメントが何であるかわかりません。何か案が?

どうもありがとう。

4

2 に答える 2

1

そのクエリに対して動的サンプリングがオンになっています。また

  1. クエリは/*+ DYNAMIC_SAMPLING */ヒントを使用します
  2. コードはalter session set optimizer_dynamic_sampling=コマンドを発行します
  3. optimizer_dynamic_sampling は、データベースの spfile で設定されます。

例えば

alter session set OPTIMIZER_DYNAMIC_SAMPLING = 2; 

次に、インデックスを使用できる非常に選択的な (ただし正確ではない) 条件で、大きなテーブルに対してクエリを発行します。

select * from mtl_system_items /* biiig table */ 
where organization_id = 92 
and segment1 LIKE 'DY_'  /* very selective condition with index */

実行すると、すぐにデータが返されます。しかしその後、

alter session set OPTIMIZER_DYNAMIC_SAMPLING = 10; 

同じことを再実行するとSELECT、テーブル内のすべてのブロックをサンプリングして、昼食に出かけます。

于 2016-06-03T14:44:22.777 に答える