[英]java.sql.date , java.sql.timestamp predicate -> Oracle partition data type
嗨,我們有一個很大的Oracle列對象,並用DATE的數據類型對其進行了分區
其中一個分區看起來像這樣:
GCP_P1 TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 83 M_DATA01 DISABLED 348132 15214 146 08.06.2014 02:20:40 1078 0
每個分區為期一周。
我們使用jdbc通過瘦客戶端運行sql。 沒有ORM只是純jdbc。
當我們用於分區列的謂詞項是java.sql.timestamp時,我們意識到查詢不會從分區中受益。 但是,當類型為java.sql.date時,執行計划將顯示成功的分區訪問。
因此,例如我們的sql看起來像這樣:
SELECT COUNT(1) FROM ATABLE WHERE PARTITIONED_COLUMN > ?
當我們的java語句是:
preparedStatement.setDate(...); // it benefits from partition
但是當這樣的時候:
preparedStatement.setTimestamp(...); //it does not benefits from partition
我正在從蟾蜍那里看它們。 我經歷過,當它是java.sql.date時,它在oracle上被解釋為DATE,當它是java.sql.timestamp時,它被解釋為TIMESTAMP
我正在使用以下SQL語句跟蹤捕獲的JDBC日期類型
SELECT *
FROM V$SQL_BIND_CAPTURE
WHERE WAS_CAPTURED = 'YES' AND LAST_CAPTURED BETWEEN SYSDATE-1/50 AND SYSDATE
ORDER BY LAST_CAPTURED DESC;
我的問題是您遇到過這樣的問題嗎? 如果是這樣,您可以指導我處理一些文件。
您描述的案例記錄在第8節“映射JDBC API入門”的 SQL和Java類型中
因為標准Java類java.util.Date與這三種JDBC日期/時間類型中的任何一種都不完全匹配(它既包含DATE和TIME信息,又沒有納秒),所以JDBC定義了java.util.Date的三個子類來對應SQL類型。 他們是:
java.sql.Date
有關SQL DATE的信息。 java.util.Date基類的小時,分鍾,秒和毫秒字段應設置為零。 如果提供給java.sql.Date構造函數的毫秒數為負,則驅動程序將日期計算為1970年1月1日之前的毫秒數。否則,日期將計算為1月1日之后的指定毫秒數。 1970年。
的java.sql.Time
SQL TIME信息。 java.util.Date基類的年,月和日字段設置為1970,一月和1。這是Java時代中的“零”日期。
的java.sql.Timestamp
有關SQL TIMESTAMP的信息。 此類通過添加一個nanoseconds字段來擴展java.util.Date。
oracle jdbc開發人員指南包含從jdbc類型到oracle數據類型的映射。 由於其復雜性,有一部分專門針對DATE數據類型。 它具有以下注意事項:
在Oracle數據庫11g中,如果在DATE列上有一個索引供SQL查詢使用,則為了獲得更快,更准確的結果,必須按以下方式使用setObject方法:
Date d = parseIsoDate(val);
Timestamp t = new Timestamp(d.getTime());
stmt.setObject(pos, new oracle.sql.DATE(t,(Calendar)UTC_CAL.clone()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.