以下的文章我們主要介紹的是Oracle JDBC 的 setTimestamp 的相關的性能問題,我前兩天在相關網站看見Oracle JDBC 的 setTimestamp 的相關的性能問題的資料,覺得挺好,就拿出來供大家分享。
偶然發現三年前的一個技術問題。當時比較匆忙,避免掉即過去了。現在 Metalink 上其實已經把這個問題作為一個 Bug 處理了。
問題描述:通過 JDBC 上來的 Java 查詢應用,SQL 表現異常。表字段使用了 DATE 類型,針對該字段時間區域很小的范圍查詢(預期應該是走 INDEX RANGE SCAN),在 SQL Map 上指定索引,發現無效。仍然是 FULL TABLE SCAN 。
罪魁禍首:setTimestamp() 把值綁定為 TIMESTAMP 類型,這樣和 DATA 類型比較的時候,CBO 就會選擇全表掃描。
通過 Trace 能觀察到該異常行為。TIMESTAMP 在 Oracle JDBC 9.2.0.1 上就有了,連續幾個版本其實都有類似的問題。
解決辦法:使用 setString() 而不是 setTimestamp() 方法。
這個故事告訴我們,Oracle JDBC 其實問題挺多的。同樣,TIMESTAMP 潛在的問題也不少。