2011-08-18 56 views
1

我的火鳥查詢中有索引問題。我的火鳥查詢計劃沒有使用正確的索引

以下是我的查詢。

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)升序 (踵)升序 (踵,OBJID)升序 (踵,OBJID)降序

索引表B(mm_itrgdt)

(HEADER_ID)升序 (ITEM_ID)升序 (WH_ID)升序 (LOT_NO)升序 (SERIAL_NO,ITEM_ID)升序 (HEADER_ID,ITEM_ID,WH_ID,SERIAL_NO,LOT_NO)升序 (HEADER_ID,ITEM_ID,WH_ID)升序 (CALCTYP,OBJID)升序 (ITEM_ID,WH_ID)升序 ( CALCTYP,OBJID,ITEM_ID,WH_ID)升序 (CALCTYP,OBJID)降序 (OBJID,ITEM_ID,WH_ID)降序 (OBJID)降序

預先感謝

問候, Reynaldi

+2

我知道這聽起來很輕佻,卻苦於您請重新格式化您的SQL,以便它更具可讀性(縮進,因此顯示爲「代碼」)。另外,請說明您使用的索引符號是什麼意思 - 我不清楚爲什麼你有一些字段分組,有些沒有(我不是火鳥專家,所以如果我問一些明顯的問題,請原諒我)。或者更好的是使用標準的CREATE INDEX語法。 –

+0

你使用的工具如IBExpert或Database Workbench? –

回答

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認爲它的使用會造成更多的傷害,然後幫助。您可以手動指定查詢計劃或嘗試重寫它。

在你的情況,你可以擺脫OR條件使用UNION操作:

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 
+0

這不起作用,並給你一個錯誤'動態SQL錯誤; SQL錯誤代碼= -104;意外的命令行1第19列結束。這工作:'執行語句'設置統計索引'|| :我從http://www.firebirdfaq.org/faq167/獲得的idx –

0

這只是一個直覺,而是要設法還可以選擇b.objid