Отображение даты Oracle на дату и время с помощью Nhibernate 3.2 - PullRequest
2 голосов
/ 26 марта 2012

Во-первых, простой пример для описания моей проблемы.

Модель

public class User
{
    public virtual String UserID { get; set; }
    public virtual String UserName { get; set; }
    public virtual DateTime LastLoginTime { get; set; }
}

Mapping

<id name="UserID" type="AnsiString">
  <column name="p_UserID_vc" length="20"></column>
  <generator class="assigned"/>
</id>
<property name="UserName" column="UserName_vc"  type="AnsiString">
<property name="LastLoginTime" column="LastLoginTime_d" type="DateTime">

таблица

create table T_User
(
    p_userid_vc         VARCHAR2(20) not null,
    username_vc         VARCHAR2(50),
    lastlogintime_d     DATE,
)

Теперь в этой таблице один миллион пользователей. Я создаю индекс оракула в LastLoginTime. Я использую запрос так:

var list = Responsity<User>.Where(q => q.LastLoginTime <= DateTime.Now &&   
           q.LastLoginTime >= DateTime.Now.AddDays(-7));           

Я использую Nhibernate Profile для наблюдения за настоящей строкой sql:

select t.p_UserID_vc
  from T_User t
 where t.lastlogintime_d >= TIMESTAMP '2012-03-19 16:58:32.00' /* :p1 */
   and t.lastlogintime_d <= TIMESTAMP '2012-03-26 16:58:32.00' /* :p2 */

Он не использовал индекс. Я думаю, что он должен использовать 'to_date', чтобы он мог использовать индекс. Как настроить файл сопоставления?

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Существует несколько причин, по которым он может не использовать ваш индекс:

  1. Тип данных LastLoginTime равен DATE, но параметры TIMESTAMP с,так что это может быть неявное преобразование столбца во временную метку, что означает, что он не может использовать индекс.

  2. Оптимизатор на основе затрат (CBO) может использовать статистику, которая указывает, что использованиеиндекс будет менее эффективным, чем не использовать его.Например, в таблице может быть очень мало строк, или гистограмма может сказать CBO, что большое количество строк соответствует диапазону дат, по которому вы запрашиваете.Для полных сканирований таблиц нередко превосходят запросы, использующие индексы.

  3. Возможно, статистика в таблице устарела, что заставляет CBO делать неточные оценки.

Составьте план объяснения для вашего запроса, чтобы определить причину.

Примечание: план для запроса, который использует литеральные значения (например, TIMESTAMP '...'), вполне может бытьотличается от запроса, который использует переменные связывания (например, p1 и p2).Запустите план объяснения для запроса, который фактически выполняется.

1 голос
/ 21 августа 2014

на всякий случай, если кто-то все еще ищет ответ, надеюсь, это поможет исправлению - настроить его на надлежащий диалект, в моем случае это NHibernate.Dialect.Oracle10gDialect

...