select 料號(hào),生效日,價(jià)格 from
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、虛擬主機(jī)、營(yíng)銷軟件、網(wǎng)站建設(shè)、孝感網(wǎng)站維護(hù)、網(wǎng)站推廣。
material m
inner join (
select a.物料ID, max(a.價(jià)格生效日) 價(jià)格生效日 from material a, price b
where a.物料ID=b.物料ID and a.價(jià)格生效日=b.價(jià)格生效日
and a.料號(hào)='AAA'
) n on m.id=n.物料ID
下面這三個(gè)字段上分別建索引
material:料號(hào)
material:物料ID
price :物料ID
原始未分頁(yè)查詢Sql代碼如下 ?
select ROWNUM rn t id ID o name YYB u name XM t MC from tZDYSX?? t tuser u lbanization o where t cjr=u id and id=code and t gx = ?? order by ID?
結(jié)果如下 RN??? ID????? YYB???????XM???? MC ? ?? ? 某證券總部???? 管理員 測(cè)試 ??? ?某證券總部???? 管理員 持有上港 股以上 ? ? 某證券總部???? 管理員 十年規(guī)劃 ?? 某證券總部???? 管理員 開發(fā)渠道為上海 ?? 某證券總部???? 管理員 萬(wàn)科A ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 今天過(guò)生日的客戶 ?? ? 某證券總部???? 管理員 客戶狀態(tài)正常 ? ? 某證券總部???? 管理員 無(wú)交易 ?? 某證券總部???? 管理員 OA ? ? 某證券總部???? 管理員 幸運(yùn)客戶 ?? 某證券總部???? 管理員 風(fēng)險(xiǎn)型 ?? 某證券總部???? 管理員 tst ?? 白沙網(wǎng)上交易?? 安昌彪 安客戶正常 ? ? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 客戶號(hào)包含 ?? 某證券總部???? 管理員 aaa ?? 某證券總部???? 管理員 ssssssss ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 aaaaaa
rows selected
最初我使用如下Sql代碼查詢 ?
select * from (select ROWNUM rn t id ID o name YYB u name XM t MC??? from tZDYSX t tuser u lbanization o where t cjr=u id and id=code and??? t gx = order by t ID )Where rn and rn= ;?
這種方法能成功分頁(yè) 結(jié)果如下 RN??? ID??????? YYB???????XM????? MC ?? 某證券總部???? 管理員 開發(fā)渠道為上海 ?? 某證券總部???? 管理員 萬(wàn)科A ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 今天過(guò)生日的客戶 ?? 某證券總部???? 管理員 客戶號(hào)包含 ?? 某證券總部???? 管理員 aaa ?? 某證券總部???? 管理員 ssssssss ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 aaaaaa
rows selected
從結(jié)果看來(lái) 有個(gè)問(wèn)題 此語(yǔ)句Sql代碼 order by CJSJ DESC? 被執(zhí)行 但是是在分后的第 到 條記錄的結(jié)果集中再進(jìn)行排序 而不是先排序后分頁(yè) (本來(lái)希望顯示ID為 到 結(jié)果變?yōu)?到 )
后來(lái)變?yōu)橐韵耂ql代碼查詢 ?
SELECT *??? FROM(??? SELECT ROWNUM RN TA *??? FROM(?? select t id ID o name YYB u name XM t MC?? from tZDYSX t tuser u lbanization o??? where t cjr=u id and id=code and t gx = order by t ID?? )TA WHERE ROWNUM = ?? )WHERE RN ? SELECT * FROM( SELECT ROWNUM RN TA * FROM(select t id ID o name YYB u name XM t MCfrom tZDYSX t tuser u lbanization o where t cjr=u id and id=code and t gx = order by t ID)TA WHERE ROWNUM = )WHERE RN
結(jié)果如下 RN??? ID???? YYB???????????XM???? MC ?? 某證券總部???? 管理員 幸運(yùn)客戶 ?? 某證券總部???? 管理員 風(fēng)險(xiǎn)型 ?? 某證券總部???? 管理員 tst ?? 白沙網(wǎng)上交易?? 安昌彪 安客戶正常 ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 客戶號(hào)包含 ?? 某證券總部???? 管理員 aaa ?? 某證券總部???? 管理員 ssssssss ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員
rows selected
看來(lái)結(jié)果是正確的
總結(jié) 第二種方法其中最內(nèi)層的查詢Sql代碼
select t id ID o name YYB u name XM t MC?? from tZDYSX t tuser u lbanization o??? where t cjr=u id and id=code and t gx = order by t ID?
表示不進(jìn)行翻頁(yè)的原始查詢語(yǔ)句 ROWNUM = 和RN 控制分頁(yè)查詢的每頁(yè)的范圍 第二種方法在大多數(shù)情況擁有較高的效率 分頁(yè)的目的就是控制輸出結(jié)果集大小 在上面的分頁(yè)查詢語(yǔ)句中 這種考慮主要體現(xiàn)在WHERE ROWNUM = 這句上
選擇第 到 條記錄存在兩種方法 第二種方法正是在查詢的第二層通過(guò)ROWNUM = 來(lái)控制最大值 在查詢的最外層控制最小值 而第一種方法是去掉查詢第二層的WHERE ROWNUM = 語(yǔ)句 在查詢的最外層控制分頁(yè)的最小值和最大值
一般來(lái)說(shuō) 第二個(gè)查詢的效率比第一個(gè)高得多 這是由于CBO 優(yōu)化模式下 Oracle可以將外層的查詢條件推到內(nèi)層查詢中 以提高內(nèi)層查詢的執(zhí)行效率 對(duì)于第二個(gè)查詢語(yǔ)句 第 層的查詢條件WHERE ROWNUM = 就可以被Oracle推入到內(nèi)層查詢中 這Oracle查詢的結(jié)果一旦超過(guò)了ROWNUM限制條件 就終止查詢將結(jié)果返回了
而第一個(gè)查詢語(yǔ)句 由于查詢條件Where rn and rn= 是存在于查詢的第三層 而Oracle無(wú)法將第三層的查詢條件推到最內(nèi)層(即使推到最內(nèi)層也沒(méi)有意義 因?yàn)樽顑?nèi)層查詢不知道RN代表什么) 因此 對(duì)于第一個(gè)查詢語(yǔ)句 Oracle最內(nèi)層返回給中間層的是所有滿足條件的數(shù)據(jù) 而中間層返回給最外層的也是所有數(shù)據(jù) 數(shù)據(jù)的過(guò)濾在最外層完成 顯然這個(gè)效率要比第二個(gè)查詢低得多
lishixinzhi/Article/program/Oracle/201311/17706
1。 看能不能建立索引(和其他幾位仁兄一致)
2。 能否不用like 如果tb_one中的id2不是主鍵也不是索引,可以改為substr(id2,1,2) = 'xy'
3。 排序盡量不要,既然LZ說(shuō)了這是前提那就省略不說(shuō)
4。 加hint并行處理(這個(gè)會(huì)提高不少,但需要數(shù)據(jù)庫(kù)開啟并行,并且硬件足以支持)
5。 這個(gè)肯定是全表掃描,不用想(都like了)
6。 根據(jù)你的時(shí)間條件,可以寫成substr(instime) = '20130108'
7。 加表別名,并不要使用星號(hào)
9。 少些幾個(gè)子查詢。。。
order by是打亂原來(lái)默認(rèn)的數(shù)據(jù)順序,根據(jù)你要求的字段進(jìn)行重新排序,這個(gè)也是需要花時(shí)間的