oracle分页查询加总数,oracle count 百万级 分页查询记要总数、总条数优化
oracle count 百萬級(jí) 分頁查詢記錄總數(shù)、總條數(shù)優(yōu)化
oracle count 百萬級(jí) 查詢記錄總數(shù)、總條數(shù)優(yōu)化
最近做一個(gè)項(xiàng)目時(shí),做分頁時(shí),發(fā)現(xiàn)分頁查詢速度很慢,分頁我做的是兩次查詢,一次是查詢總數(shù),一次是查詢分頁結(jié)果
/** 查詢總記錄數(shù) **/
SELECT
COUNT(id)
FROM
USER
order by
id
/** 查詢結(jié)果集 **/
select
*
from
( select
row_.*,
rownum rownum_
from
( select
id ,
user_number,
user_name,
user_password,
sex,
Registered_time,
last_login_time,
post
from
USER u
order by
u.id) row_
where
rownum <= ?
)
where
rownum_ > ?
user表中的記錄是128萬多條,這個(gè)是沒有查詢條件時(shí)的查詢,也就是用戶剛剛進(jìn)入模塊時(shí)的查詢,發(fā)現(xiàn)查詢時(shí)間是2566ms~2152ms之間,單獨(dú)執(zhí)行每條語句,發(fā)現(xiàn)第一條的執(zhí)行時(shí)間在2000ms以上,在PL/SQL中執(zhí)行的結(jié)果也證實(shí)了我的判斷。所以要對(duì)select count語句進(jìn)行優(yōu)化。
在網(wǎng)上找了很多優(yōu)化方案,大多不盡人意,(分表的方式聽上去不錯(cuò),不過由于單表是歷史原因,這里就不作考慮)。最后找到一個(gè)比較令人滿意的答。就是在語句中加入 /*+ROWID(USER)*/或者/*+ INDEX(USER ID) */ 來提高查詢效果。
聽說這個(gè)就是強(qiáng)制使用索引統(tǒng)計(jì)結(jié)果?如果有哪位大蝦能把原理詳細(xì)告訴我,請(qǐng)來多多指點(diǎn)!
SELECT /*+ROWID(USER)*/ count(*) FROM USER t
或者
SELECT /*+ INDEX(USER ID) */ count(*) FROM USER t
使用后,單條統(tǒng)計(jì)總數(shù)的查詢?cè)?00ms左右,分頁查詢結(jié)果基本在900ms~950ms之間,基本在一秒之內(nèi),達(dá)到了當(dāng)初設(shè)計(jì)需求。
當(dāng)然,這個(gè)是沒有加查詢條件的,當(dāng)把查詢條件加入后,不管前面加不加強(qiáng)制索引,結(jié)果時(shí)間都在2000ms之間,所以,如果要進(jìn)行有條件的查詢,就要在where條件中進(jìn)行優(yōu)化。特別注意條件字段查詢前后順序。
具體優(yōu)化請(qǐng)參考
1.淺析Oracle語句優(yōu)化規(guī)則
http://www.cnblogs.com/Automation_software/archive/2011/01/21/1940883.html
總結(jié)
以上是生活随笔為你收集整理的oracle分页查询加总数,oracle count 百万级 分页查询记要总数、总条数优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 回滚空间查询,oracle
- 下一篇: 谈谈你对oracle的认识,对Oracl