2009-12-15 79 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