Когда я запрашиваю таблицу бронирования через JPA/EclipseLink и ищу конкретное местоID, текущий существующий индекс myindex не используется. Sybase решает сделать сканирование таблицы.EclipseLink Sybase: Существующий индекс не используется
Когда я копирую sql из файла журнала Glassfish в sql-редактор и запускаю его там, он использует индекс. ????
Упрощенная SQL:
create table pub.BOOKING(
bookID numeric(10) identity,
placeID smallint not null
)
create index idx_BOOKING_PLACEID on pub.BOOKING(placeID)
** SHOWPLAN из Sybase ASE при работе от JPQL **
Die Art der Abfrage ist SELECT.
VON TABELLE pub.BOOKING
Verschachtelte Iteration.
Tabellen-Scan.
Vorwärts-Scan.
Positionierung am Tabellenanfang.
Parallel mit einem 5-Weg-Hash-Scan ausgefü
Für die Datenseiten wird eine I/O-Größe vo
Mit LRU Pufferersetzungsstrategie für Date
Parallele Netzpufferzusammenführung.
** JPQL Запрос **
Placement p = em_local.find(Placement.class, 207);
TypedQuery<Booking> query = em_local.createQuery("select b from Booking b where b.placement = :place", Booking.class);
query.setParameter("place", p);
List<Booking> list = query.getResultList();
** SHOWPLAN из Sybase ASE при работе в редакторе sql **
VON TABELLE
pub.BOOKING
Verschachtelte Iteration.
Index: idx_BOOKING_PLACEID
Vorwärts-Scan.
Positionierung durch Schlüssel.
Schlüssel sind:
placeID AUFST
Parallel mit einem 5-Weg-Hash-Scan ausgeführt.
Für die Index-Blattebenen wird eine I/O-Größe von 2 KByte verwendet.
Mit LRU Pufferersetzungsstrategie für Index-Blattseiten.
Für die Datenseiten wird eine I/O-Größe von 2 KByte verwendet.
Mit LRU Pufferersetzungsstrategie für Datenseiten.
** Запрошенного Выбрать из логфайла **
20131118 08:44:59,845 FINE sql SELECT bookID, placeID FROM pub.BOOKING WHERE (placeID = ?) bind => [207]
** После некоторых исследований **
Похоже SMALLINT типа данных от Sybase является проблемой здесь.
EclipseLink запросы как это:
declare @p0 int
select @p0 = 5
select * from pub.BOOKING where placeID = @p0
Если я пишу объявить @ p0 SMALLINT индекс используется. Если я пишу declare @ p0 int, индекс не используется.
Так что, я думаю, JPA отображает Integer в int. И это вызывает проблему.
Как я могу сказать JPA использовать smallint для этого столбца?
Put следующие свойства в вашем 'настойчивостью.xml': Затем покажите нам, как Eclipselink переводит ваш запрос JPQL на SQL. –
hgoebl
Я добавил его в вопрос выше –
Странный. Иногда оптимизатор не использует индекс, потому что таблица слишком короткая (например, имеет только 15 записей) или распределение (разные значения) не идеально подходит для использования индекса (например, у вас есть столбец, который имеет только два разных значения) m 'и' f ', и оба они покрывают ~ 50% строк). Используете ли вы ту же базу данных для GlassFish и интерактивного sql-редактора? Если да, я не могу вам помочь. – hgoebl