0

私は、当社が読み取りアクセス権しか持たない顧客データベース (db2) を使用しています。したがって、インデックスやスキーマなどを制御することはできません。この点を強調したいのは、どこにあるかわからないインデックスがまだある可能性があるからです。したがって、クエリを別の方法で最適化する必要があります。とにかく、回避策よりも、これらがどのように機能するかを理解することに関心があります (ただし、それにも関心があります)。この種の操作では DB が高速であることを期待していましたが、明らかにそうではありません。あるいは、深刻な落とし穴に陥っているのかもしれません。

シナリオ: クエリを分析し、理解できない次のように削除しました。q1このクエリを次の形式で呼び出しましょう

select c.cid, c.bid, c.ryear, t.tyear, td.nr
 from mySchema.cTable c
 join mySchema.dTable d on d.cid = c.cid
 join mySchema.ipTable ip on (ip.did = d.did and ip.type = 'type_s')
 join mySchema.tTable t on t.xtime = ip.xtime
 join mySchema.tdTable td on c.tdid = 'type_'||td.oid
where
 c.ryear = 2009
 and d.rr = 'ugk'
 and d.stat = 'stat#1'
;

このクエリは約 8000 エントリを取得し、実行に 1 分以上かかります。

ここで奇妙な点: 句の条件を 1 つでも削除するwhereと、クエリの実行に 2 秒もかかりません。完全を期すために: ryear を削除すると、結果セットは約 10000 エントリを返します。結果セットを削除するd.stat = 'stat#1'と、約 45000 エントリが含まれ、削除すると、d.rr = 'ugk'削除しない場合とまったく同じ結果が得られます (つまり、この特定のケースでは、この条件は結果セットに対して冗長です)。

3つの条件がすべて揃っている場合、この巨大な時間差がどのように/なぜ発生するのか、誰か説明できますか? 単純に 2 つの条件を設定してから、3 つ目の条件の cli を grep すると、かなり高速になります。DBは一体何をしているのですか?

注: DbVisualizer を使用してクエリを実行しています。時間 x で実行すると言うとき、フェッチ時間ではなく、クエリの実行時間を意味します (参照: http://www.dbvis.com/forum/thread.jspa?threadID=1536 )。and の部分を除外した場合とまったく同じ結果を取得するために、3 つのステートメントすべて (約 10 分!) がある場合、フェッチ時間も大幅に増加しますd.rr = 'ugk'。条件が 2 つしかない場合、フェッチ時間は最大で 10 秒です (つまり、45000 エントリを取得する場合)。完全を期すために、まったくない場合、where130000 エントリを取得します (exec: 1.8 秒、フェッチ 28 秒)

私の質問: 何が起こっているのですか? where 句の 1 つのステートメントで、dbs の実行計画が大幅に悪化することはありますか?

ps: テーブル/列の名前が表現力豊かでなくて申し訳ありませんが、明らかな理由から少し難読化する必要がありました。pps: もっと適切なものが見つかったら、タイトルを編集していただければ幸いです。

4

2 に答える 2

0

遅いクエリは、通常、完全なテーブル スキャンを示しています。通常、すべてはテーブル スキャンではなくインデックスを介して取得されます。IBM Data Studioには、テーブル スキャンの原因を特定するのに役立つツールがある場合があります。

次のインデックスをお勧めします。

SET SCHEMA mySchema;
CREATE INDEX cTable_ryear ON cTable(ryear) INCLUDE (cid, bid, tdid);
CREATE INDEX dTable_rr_stat_cid ON dTable(rr, stat, cid) INCLUDE (did);
CREATE INDEX ipTable_did_type ON ipTable(did, type) INCLUDE (xtime);
CREATE INDEX tTable_xtime ON tTable(xtime) INCLUDE (tyear);

tdTable へのアクセスを最適化する方法もあるでしょう。

于 2015-05-29T19:00:46.997 に答える
-1

どのインデックスが配置されているか教えていただけますか ( SYSIBM.SYSINDEXES)?

WITHおそらく、別名一時テーブルを使用してクエリを2つに分割できます...

于 2015-05-29T19:23:45.517 に答える