1

我有一个超过 10 000 000 行的表。在 TOAD 中,这个查询非常好用:

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;

类似的查询但没有 Oracle 提示语法的工作速度要慢得多!

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

谢谢!

4

3 回答 3

0

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

于 2009-12-15T16:18:53.873 回答
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 对结果集的预期基数所做的估计。

于 2009-12-15T16:44:05.083 回答
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
于 2009-12-17T06:52:41.947 回答