2013-11-15 14 views
1

當我通過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作爲此列?

+0

認沽按照你的'持久性。xml': 然後向我們展示Eclipselink如何將您的JPQL查詢轉換爲SQL。 – hgoebl

+0

我把它添加到上面的問題 –

+0

奇怪。有時優化器不會使用索引,因爲表太短(例如只有15條記錄),或者分佈(不同的值)不適合使用索引(例如,您有一列只有2個不同的值, m'和'f',並且它們都覆蓋了約50%的行)。您是否使用GlassFish和交互式SQL編輯器的相同數據庫?如果是,我不能幫你。 – hgoebl

回答

1

問題是Smallint數據類型。

我在實體類中使用了一個整數來訪問它。它讓JPA這樣查詢:

declare @p0 int 
select @p0 = 5 
select bookID, placeID from pub.BOOKING where placeID = @p0 

這讓我們sybase決定「where」語句不是標準參數(SARG)。這意味着它不能使用相應的索引,因爲索引的數據類型是2字節,參數是4字節。

在Entity中使用Short數據類型解決了這個問題。

**我上的Sybase ASE進行了一些查詢找出自己做錯了什麼**

必須首先安裝Sybase的MDA功能。

,顯示的,如果你有一個表掃描:

select * 
from master.dbo.monSysPlanText 
order by SPID, BatchID, SequenceNumber 

這個節目的您什麼查詢JPA是真正發送到ASE:

select * 
from master.dbo.monSysSQLText