1

firebirdクエリのインデックスに問題があります。

以下は私の質問です。

SELECT a.objid,
       b.running_qty,
       b.running_qty2,
       b.running_totalcost,
       b.running_lastcost
FROM mm_itrghd a,
     mm_itrgdt b
WHERE (a.objid = b.header_id)
AND   (b.item_id = 1200)
AND   (b.wh_id = 1)
AND   ((a.postdate < '2010-09-05 00:00:00')  OR ((a.postdate = '2010-09-05 00:00:00') AND (a.objid < 50000)))
ORDER BY a.postdate desc,
         a.objid desc,
         b.calctyp desc,
         b.objid desc

ご覧のとおり、セクション順に、descを使用しています。降順のインデックスがありますが、クエリプランはそれを使用していません。インデックステーブルA(a.objid)とテーブルB(b.item_id、b.wh_id)のみを使用します。見逃したものはありますか?どのインデックスを作成する必要があると思いますか?

表Aのインデックス(mm_itrghd)

(TR_CODE、DOC_ID)昇順(OBJID)昇順(TR_CODE)昇順(POSTDATE)昇順(POSTDATE、OBJID)昇順(POSTDATE、OBJID)降順

表Bのインデックス(mm_itrgdt)

(HEADER_ID)Ascending(ITEM_ID)Ascending(WH_ID)Ascending(LOT_NO)Ascending(SERIAL_NO、ITEM_ID)Ascending(HEADER_ID、ITEM_ID、WH_ID、SERIAL_NO、LOT_NO)Ascending(HEADER_ID、ITEM_ID、WH_ID)Ascending(HEADER_ID、ITEM_ID、WH_ID)Ascending( 、WH_ID)昇順(CALCTYP、OBJID、ITEM_ID、WH_ID)昇順(CALCTYP、OBJID)降順(OBJID、ITEM_ID、WH_ID)降順(OBJID)降順

前もって感謝します

よろしく、レイナルディ

4

2 に答える 2

0

まず、Firebirdは、使用するインデックスと使用しないインデックスを選択するときにインデックスを中継するため、インデックスの統計を更新します。データベースのバックアップと復元のサイクルを実行するか、次のコードを実行します。

EXECUTE BLOCK
AS
  DECLARE VARIABLE IDX VARCHAR(31);
BEGIN
  FOR
    SELECT rdb$index_name FROM rdb$indices
    WHERE NOT rdb$index_name LIKE 'RDB$%'
    INTO :idx
  DO BEGIN
    EXECUTE STATEMENT 'update statistics ' || :idx
    WITH AUTONOMOUS TRANSACTION; 
  END
END

その後、クエリプランを確認してください。インデックスが使用されていない場合、それはFirebirdが、その使用が役立つよりも害を及ぼすと考えているためです。クエリの計画を手動で指定するか、書き直してみてください。

あなたの場合、UNION演算子を使用してOR条件を取り除くことができます:

select 
  a.postdate, 
  a.objid, 
  b.calctyp, 
  b.objid,
  b.running_qty, 
  b.running_qty2, 
  b.running_totalcost, 
  b.running_lastcost 
from 
  mm_itrghd a join mm_itrgdt b 
    on a.objid=b.header_id 
where 
  (b.item_id=1200)
  and (b.wh_id=1) 
  and (a.postdate<'2010-09-05 00:00:00') 

union all

select 
  a.postdate, 
  a.objid, 
  b.calctyp, 
  b.objid,
  b.running_qty, 
  b.running_qty2, 
  b.running_totalcost, 
  b.running_lastcost 
from 
  mm_itrghd a join mm_itrgdt b 
    on a.objid=b.header_id 
where 
  (b.item_id=1200)
  and (b.wh_id=1) 
  and (a.postdate='2010-09-05 00:00:00') 
  and (a.objid<50000)

order by 
  1 desc, 2 desc, 3 desc, 4 desc
于 2011-08-18T12:24:07.653 に答える
0

ただの直感ですが、b.objidも選択してみてください

于 2011-09-02T08:48:23.183 に答える