私は、当社が読み取りアクセス権しか持たない顧客データベース (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 エントリを取得する場合)。完全を期すために、まったくない場合、where
130000 エントリを取得します (exec: 1.8 秒、フェッチ 28 秒)
私の質問: 何が起こっているのですか? where 句の 1 つのステートメントで、dbs の実行計画が大幅に悪化することはありますか?
ps: テーブル/列の名前が表現力豊かでなくて申し訳ありませんが、明らかな理由から少し難読化する必要がありました。pps: もっと適切なものが見つかったら、タイトルを編集していただければ幸いです。