NHibernate + Свободный NHibernate + Oracle Индекс - PullRequest
1 голос
/ 15 декабря 2009

У меня есть таблица с более чем 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 в запросе?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 15 декабря 2009

Предположительно, запрос без подсказки не использует индекс.

Попробуйте это в любом инструменте 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)
/

... и опубликовать вывод последней команды. Мы можем использовать это, чтобы увидеть, какие оценки оракул делает для ожидаемой мощности набора результатов.

0 голосов
/ 17 декабря 2009

С подсказкой / * + 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
0 голосов
/ 15 декабря 2009

Актуальна ли статистика вашего оптимизатора? Если нет, то вы можете обнаружить, что после их создания вам вообще не понадобится подсказка.

...