首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate + Fluent NHibernate + Oracle索引

NHibernate + Fluent NHibernate + Oracle索引
EN

Stack Overflow用户
提问于 2009-12-16 00:04:31
回答 3查看 1.2K关注 0票数 1

我有一个超过10,000,000行的表。在TOAD中,这个查询在上面运行得很好:

代码语言:javascript
复制
select /*+ INDEX(x IDX_CASHFLOW_COMPLEX)*/ * 
from MYPR.CASHFLOW x 
where fk_debet in (21856, 21854, 21855)

IDX_CASHFLOW_COMPLEX是通过以下脚本创建的5个列的索引:

代码语言:javascript
复制
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提示?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-16 00:18:54

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

票数 0
EN

Stack Overflow用户

发布于 2009-12-16 00:44:05

假设没有提示的查询没有使用索引。

在任何sql工具中尝试执行以下操作:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2009-12-17 14:52:42

With提示/* +索引(...) */:

代码语言:javascript
复制
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

不使用提示/* +索引(...) */:

代码语言:javascript
复制
-------------------------------------------------------------------
| 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1908461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档