2009-12-15 78 views
0

我有一個超過10萬行的表。 蟾蜍此查詢工作得非常好就可以了:NHibernate +流利NHibernate的+甲骨文索引

select /*+ INDEX(x IDX_CASHFLOW_COMPLEX)*/ * 
from MYPR.CASHFLOW x 
where fk_debet in (21856, 21854, 21855) 

IDX_CASHFLOW_COMPLEX是5列指數由以下腳本創建:

CREATE INDEX MYPR.IDX_CASHFLOW_COMPLEX ON MYPR.CASHFLOW 
(FK_DEBIT, FK_CREDIT, FK_DOCUMENT, PAYMENTDATE, FK_PAYMENTCODE) 
LOGGING 
TABLESPACE INDX 
PCTFREE 10 
INITRANS 2 
MAXTRANS 255 
STORAGE (
      INITIAL   64K 
      MINEXTENTS  1 
      MAXEXTENTS  UNLIMITED 
      PCTINCREASE  0 
      BUFFER_POOL  DEFAULT 
      ) 
NOPARALLEL; 

類似的查詢,但沒有暗示甲骨文語法工作顯著慢!

您能否建議是否可以告訴NHibernate在查詢中添加Oracle提示?

謝謝!

回答

0

您的優化程序統計數據是最新的嗎?如果沒有,你可能會發現,一旦它們生成,你根本不需要提示。

+0

我會檢查tommorow,謝謝你的回答 – barser 2009-12-15 19:04:21

0

推測沒有提示的查詢不使用索引。

試試這個在任何SQL工具:

explain plan for 
select /*+ INDEX(x IDX_CASHFLOW_COMPLEX)*/ * 
from MYPR.CASHFLOW x 
where fk_debet in (21856, 21854, 21855) 
/

select * from table(dbms_xplan.display) 
/

...併發布最後一個命令的輸出。我們可以使用它來查看oracle對結果集預期基數的估計。

+0

我將在這裏張貼結果tommorow下班。謝謝! 其實我很有興趣在任何nhibernate查詢中添加Oracle提示的可能性。我在開始描述的情況只是一個例子......或者在sql世界中添加提示並不是很好的做法嗎? – barser 2009-12-15 19:03:47

+0

解釋計劃被髮布爲另一個答案,因爲註釋字段中缺少代碼格式 – barser 2009-12-17 06:54:45

+0

看起來優化器認爲該表很小,因爲它將全表掃描的成本評估爲「2」。該表可能有不正確的統計信息,需要使用DBMS_Stats重新收集它們。我明白,在查詢中加入提示可以完成這項工作,但是對於幾乎所有涉及表格的查詢,您都必須執行此操作 - 這樣可以更好地統計數據。 – 2009-12-17 07:17:59

0

隨着提示/ * + INDEX(...)* /:

PLAN_TABLE_OUTPUT 
-------------------------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost | 
-------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | 1 | 238 | 26 | 
| 1 | INLIST ITERATOR | | | | | 
| 2 | TABLE ACCESS BY INDEX ROWID| CASHFLOW | 1 | 238 | 26 | 
|* 3 | INDEX RANGE SCAN | IDX_CASHFLOW_COMPLEX | 1 | | 2 | 
-------------------------------------------------------------------------------------- 
Predicate Information (identified by operation id): 
--------------------------------------------------- 
3 - access("X"."FK_DEBIT"=21854 OR "X"."FK_DEBIT"=21855 OR "X"."FK_DEBIT"=21856) 
Note: cpu costing is off 

無提示/ * + INDEX(...)* /:

------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost | 
-------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | 1 | 238 | 2 | 
|* 1 | TABLE ACCESS FULL | CASHFLOW | 1 | 238 | 2 | 
-------------------------------------------------------------------- 
Predicate Information (identified by operation id): 
--------------------------------------------------- 
1 - filter("X"."FK_DEBIT"=21854 OR "X"."FK_DEBIT"=21855 OR "X" 
."FK_DEBIT"=21856) 
Note: cpu costing is off