當我通過JPA/EclipseLink查詢預訂表並搜索特定placeID時,不使用現有索引myindex。 Sybase決定進行表掃描。EclipseLink Sybase:不使用現有索引
當我將Glass從Glassfish日誌文件複製到sql編輯器並在那裏運行它時,它使用索引。 ????
簡化SQL:從
create table pub.BOOKING(
bookID numeric(10) identity,
placeID smallint not null
)
create index idx_BOOKING_PLACEID on pub.BOOKING(placeID)
**從JPQL運行時,從Sybase ASE SHOWPLAN **
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在SQL編輯器中運行時的Sybase ASE **
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]
**一些調查後**
它看起來像從Sybase中SMALLINT數據類型是這裏的問題。
EclipseLink的查詢是這樣的:
declare @p0 int
select @p0 = 5
select * from pub.BOOKING where placeID = @p0
如果我寫聲明@ P0 SMALLINT使用索引。 如果我編寫declare @ p0 int,則不使用索引。
所以我想JPA將Integer映射到int。這是造成這個問題的原因。
如何告訴JPA使用smallint作爲此列?
認沽按照你的'持久性。xml': 然後向我們展示Eclipselink如何將您的JPQL查詢轉換爲SQL。 –
hgoebl
我把它添加到上面的問題 –
奇怪。有時優化器不會使用索引,因爲表太短(例如只有15條記錄),或者分佈(不同的值)不適合使用索引(例如,您有一列只有2個不同的值, m'和'f',並且它們都覆蓋了約50%的行)。您是否使用GlassFish和交互式SQL編輯器的相同數據庫?如果是,我不能幫你。 – hgoebl