2014-07-01 28 views
1

我有這樣的查詢:不OJDBC支持Oracle提示準備語句中

String sql = "DELETE FROM " + table.getName().quoted() + " WHERE modificationTime < ? AND ROWNUM < " + (objectsPerCommit + 1); 
PreparedStatement statement = connection.prepareStatement(sql); 
statement.setObject(1, ...timestamp_value..., ...timestamp_type...); 
boolean result = statement.execute(); 
... 
statement.close(); 

所以我執行基本的SQL是:

DELETE 
    FROM 
    mytable 
    WHERE 
    modificationTime < to_date('2014-06-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') 
    AND ROWNUM <= 10000; 

這個查詢運行非常非常慢,因爲它沒有使用現有的組合索引over修改時間和其他兩列。相反,它會執行全表掃描。 如果我強制使用帶有提示的索引,如下所示,一切運行順利。

DELETE /*+ index(mytable PK_MYTABLE) */ 
    FROM 
    mytable 
    WHERE 
    modificationTime < to_date('2014-06-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') 
    AND ROWNUM <= 10000; 

我的問題是:這項工作是否通過OJDBC?我可以簡單地將代碼更改爲:

String sql = "DELETE /*+ index(mytable PK_MYTABLE) */ FROM " + table.getName().quoted() + " WHERE modificationTime < ? AND ROWNUM < " + (objectsPerCommit + 1); 
... 

和一切正常工作?或者OJDBC會以某種方式刪除評論/提示?

+3

只是嘗試 - 什麼問題? –

+2

我認爲OP想知道它是否會起作用,或者將被準備好的聲明視爲簡單的評論。 –

+1

'提示'是數據庫特定的。另外,'/ * + * /'用雙引號括起來,所以客戶端不會忽略它。但對於_bind_變量,_no_部分'SQL'可能會被客戶端潤飾。 –

回答