日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Oracle不同版本在驅(qū)動運(yùn)行中如何使用JavaDate

本文主要介紹的是Oracle不同版本在驅(qū)動運(yùn)行中如何使用Java Date的相關(guān)問題的解答,如果你在計算機(jī)學(xué)習(xí)的過程中遇到Oracle不同版本在驅(qū)動運(yùn)行中使用Java Date時,出現(xiàn)的類似的問題,你就可以點(diǎn)擊以下的文章。

站在用戶的角度思考問題,與客戶深入溝通,找到集寧網(wǎng)站設(shè)計與集寧網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋集寧地區(qū)。

這里兩天都在對一條sql進(jìn)行調(diào)優(yōu)。該sql并不復(fù)雜,類似于

select ... from some_view union all select ... from some_table where datetime >= d1 and datetime< d2 and .... 底層使用ibatis2.1.6 + Oracle 10g。

今天花了些時間繼續(xù)研究這個問題,導(dǎo)致該問題的原因的確是“導(dǎo)致Oracle對datetime字段進(jìn)行了隱式類型轉(zhuǎn)換,最終CBO未能使用該列的全局索 引”,不過問題不是出在ibatis上而是Oracle driver。

設(shè)我們使用這樣的sql通過綁定變量(類型為java.util.date)查詢數(shù)據(jù)庫,其中end_date是date類型且建立了索引。

 
 
 
  1. “select count(*) from table1 where end_date >
    = :1 and end_date <= :2” 

通常,面對這樣的sql,我們希望它的執(zhí)行計劃走index range scan。然而在默認(rèn)情況下Oracle CBO是不會選擇走索引地,以上面這語句為例,Oracle實(shí)際走的是table full scan。為什么會這樣 呢?

這類問題是Oracle不同版本在9.2以后引入了TIMESTAMP才開始出現(xiàn)地。

在 9.2之前,Oracle只有DATE,而沒有TIMESTAMP。在jdbc preparedStatement.setTimestamp時,綁定變量的類型會被正確的設(shè)置為DATE。而在9.2之后,Oracle開始支持 TIMESTAMP了,這兩者都能支持精度為yyyy-MM-dd hh24:mi:ss的時間(當(dāng)然TIMESTAMP能支持到納秒級別),但jdbc driver的api未變同樣在preparedStatement.setTimestamp時,Oracle driver就得選擇到底該把綁定變量的類型設(shè)置為DATE還是TIMESTAMP呢?

估計是由于TIMESTAMP的精度更高,Oracle 最終默認(rèn)選擇了將綁定變量的類型設(shè)置為了TIMESTAMP。那么這個時候,如果面對實(shí)際屬性為DATE的列,那么就會導(dǎo)致 Oracle隱式地進(jìn)行形如“TO_TIMESTAMP(date_column) = parameter_timestamp”轉(zhuǎn)換,要 知道Oracle CBO不會選擇被某函數(shù)作用的列上的索引,除非是函數(shù)索引。

因此,最終也會導(dǎo)致最上面的情況使用table full scan而不是index range scan。

Oracle就沒有提供別的方法來正確地提供綁定變量嗎?Oracle提供 了幾個方法來解決這個問題

1.升級到11g并使用新的正確的driver api。

2.將DATE列全都改成 TIMESTAMP列。

3.使用V8Compatible flag。

以上的相關(guān)內(nèi)容就是對Oracle不同版本驅(qū)動中使用Java Date的問題的介紹,望你有所收獲。


網(wǎng)站題目:Oracle不同版本在驅(qū)動運(yùn)行中如何使用JavaDate
當(dāng)前地址:http://www.dlmjj.cn/article/dppdoee.html