NHibernate+Fluent NHibernate+Oracle索引

NHibernate+Fluent NHibernate+Oracle索引,oracle,optimization,fluent-nhibernate,hql,icriteria,Oracle,Optimization,Fluent Nhibernate,Hql,Icriteria,我有一张超过10000行的桌子。 在TOAD中,此查询对它非常有效: select /*+ INDEX(x IDX_CASHFLOW_COMPLEX)*/ * from MYPR.CASHFLOW x where fk_debet in (21856, 21854, 21855) IDX_现金流_复合体是由以下脚本创建的5列索引: CREATE INDEX MYPR.IDX_CASHFLOW_COMPLEX ON MYPR.CASHFLOW (FK_DEBIT, FK_CREDIT, FK

我有一张超过10000行的桌子。 在TOAD中,此查询对它非常有效:

select /*+ INDEX(x IDX_CASHFLOW_COMPLEX)*/ * 
from MYPR.CASHFLOW x 
where fk_debet in (21856, 21854, 21855)
IDX_现金流_复合体是由以下脚本创建的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;
类似的查询,但没有Oracle提示语法,运行速度明显较慢

您是否可以建议NHibernate在查询中添加Oracle提示


谢谢

您的优化器统计信息是最新的吗?如果没有,您可能会发现,一旦生成它们,您就根本不需要提示。

可能没有提示的查询没有使用索引

在任何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对结果集的预期基数所做的估计。

With hint/*+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
-------------------------------------------------------------------
| 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
没有提示/*+索引…*/:

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

明天下班后我会把结果贴在这里。谢谢实际上,我对在任何nhibernate查询中添加Oracle提示的可能性很感兴趣。我在开头描述的案例只是一个例子。。。或者,在oracle world中,向sql添加提示不是一个好的做法?解释计划作为另一个答案发布,因为注释字段中缺少代码格式。看起来,乐观主义者认为表很小,因为它将完整表扫描的成本评级为2。该表可能有不正确的统计信息,需要使用DBMS_Stats再次收集这些信息。我很感激在查询中添加一个提示可以完成这项工作,但是对于几乎所有涉及表的查询,您都必须这样做——更好的是整理统计数据。