python cx_oracle 如何做分页
分页查询格式:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM 《= 40
)
WHERE RN 》= 21
其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM 《= 40和RN 》= 21控制分页查询的每页的范围。
oracle分页查询 为什么第一页显示第1条,第10条第100条及以后数据
oracle分页查询 为什么第一页显示第1条,第10条第100条及以后数据
1、通常的分页写法,也是第一种分页方法,类似如下方式:
select * from (
select a.*, rownum rn from
(select * from test a order by object_name) a
where rownum 《=1000)
where rn 》 990;
这种方式,是对表进行排序翻页,比较常见,但是,第一页与第1000页的性能差异还是挺明显的。
2、第二种的分页写法是对索引进行翻页操作,然后根据rowid 去表中取数据。 这种方式,第一页与第1000页性能相差不大。
以下语句虽然使用HINT指定使用索引, 但是仍然没有生效。
select b.* from (
select * from (
select a.*, rownum rn from
(select /*+ index(a ix_object_name) */ rowid rid from test a order by object_name) a
where rownum 《=20)
where rn 》 10) a, test b
where a.rid = b.rowid;
oracle数据库怎么实现分页,且每页三条数据
您好:oracle查询分页可分为两种情况,一种使用的是rownum ,另外一种则是使用 row_number() over(order by column_name desc)。
1.使用rownum分页查询,可用以下方式:
select t2.* from (select t1.*,rownum as rn from table_name t1 where 1=1 and rownum 《= page * page_size) t2 where t2.rn 》 (page – 1) * page_size;
2.使用 row_number() over() 分页查询
select t2.* from (select t1.*,row_number() over(order by column_name desc) as rn from table_name t1 where 1=1 )t2 where t2.rn 》 (page-1)* page_size and t2.rn 《= page * page_size;
这种方式,也是可以分页的。
希望能帮助您!
求一个通用ORACLE存储过程,实现分页和查询
create
or
replace
package
Tools
is
type
ResultData
is
ref
cursor;
procedure
sp_Page(p_PageSize
int,
–每页记录数
p_PageNo
int,
–当前页码,从
1
开始
p_SqlSelect
varchar2,
–查询语句,含排序部分
p_SqlCount
varchar2,
–获取记录总数的查询语句
p_OutRecordCount
out
int,–返回总记录数
p_OutCursor
out
ResultData);
end
Tools;
create
or
replace
package
body
Tools
is
procedure
sp_Page(p_PageSize
int,
–每页记录数
p_PageNo
int,
–当前页码,从
1
开始
p_SqlSelect
varchar2,
–查询语句,含排序部分
p_SqlCount
varchar2,
–获取记录总数的查询语句
p_OutRecordCount
out
int,–返回总记录数
p_OutCursor
out
ResultData)
as
v_sql
varchar2(3000);
v_count
int;
v_heiRownum
int;
v_lowRownum
int;
begin
—-取记录总数
execute
immediate
p_SqlCount
into
v_count;
p_OutRecordCount
:=
v_count;
—-执行分页查询
v_heiRownum
:=
p_PageNo
*
p_PageSize;
v_lowRownum
:=
v_heiRownum
–
p_PageSize
+1;
v_sql
:=
’SELECT
*
FROM
(
SELECT
A.*,
rownum
rn
FROM
(’||
p_SqlSelect
||’)
A
WHERE
rownum
《=
’||
to_char(v_heiRownum)
||
’
)
B
WHERE
rn
》=
’
||
to_char(v_lowRownum)
;
–注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
OPEN
p_OutCursor
FOR
v_sql;
end
sp_Page;
end
Tools;
oracle怎么实现分页
因为Oracle数据库没有Top关键字,所以这里就不能够像微软的数据据那样操作,这里有两种方法:
-
一种是利用相反的。
PAGESIZE:每页显示的记录数
CURRENTPAGE:当前页号
数据表的名字是:components
索引主键字是:id
select * from components where id not in(select id from components where rownum《=(PAGESIZE*(CURRENTPAGE-1))) and rownum《=PAGESIZE order by id;
如下例:
select * from components where id not in(select id from components where rownum《=100) and rownum《=10 order by id;
从101到记录开始选择,选择前面10条。 -
使用minus,即中文的意思就是减去,呵呵,这语句非常的有意思,也非常好记
select * from components where rownum《=(PAGESIZE*(CURRENTPAGE-1)) minus select * from components where rownum《=(PAGESIZE*(CURRENTPAGE-2));
如例:select * from components where rownum《=10 minus select * from -
一种是利用Oracle的rownum,这个是Oracle查询自动返回的序号,一般不显示,但是可以通过select rownum from ,可以看到,是从1到当前的记录总数。
select * from (select rownum tid,components.* from components where rownum《=100) where tid《=10;
oracle数据库,搜索百万级别数据分页优化问题
oracle count 百万级 分页查询记录总数、总条数优化
Oracle count 百万级 查询记录总数、总条数优化
最近做一个项目时,做分页时,发现分页查询速度很慢,分页我做的是两次查询,一次是查询总数,一次是查询分页结果
view plain copy
/** 查询总记录数 **/
SELECT
COUNT(id)
FROM
USER
order by
id
/** 查询结果集 **/
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万多条,这个是没有查询条件时的查询,也就是用户刚刚进入模块时的查询,发现查询时间是2566ms~2152ms之间,单独执行每条语句,发现第一条的执行时间在2000ms以上,在PL/SQL中执行的结果也证实了我的判断。所以要对select count语句进行优化。
在网上找了很多优化方案,大多不尽人意,(分表的方式听上去不错,不过由于单表是历史原因,这里就不作考虑)。最后找到一个比较令人满意的答。就是在语句中加入 /*+ROWID(USER)*/或者/*+ INDEX(USER ID) */ 来提高查询效果。
听说这个就是强制使用索引统计结果?如果有哪位大虾能把原理详细告诉我,请来多多指点!
view plain copy
SELECT /*+ROWID(USER)*/ count(*) FROM USER t
或者
SELECT /*+ INDEX(USER ID) */ count(*) FROM USER t
使用后,单条统计总数的查询在800ms左右,分页查询结果基本在900ms~950ms之间,基本在一秒之内,达到了当初设计需求。
当然,这个是没有加查询条件的,当把查询条件加入后,不管前面加不加强制索引,结果时间都在2000ms之间,所以,如果要进行有条件的查询,就要在where条件中进行优化。特别注意条件字段查询前后顺序。
Oracle数据库中如何快速查询分页
1.rownum分页查询:select t2.* from (select t1.*,rownum as rn from table_name t1 where 1=1 and rownum 《= page * page_size) t2 where t2.rn 》 (page – 1) * page_size;2. row_number() over() 分页查询select t2.* from (select t1.*,row_number() over(order by column_name desc) as rn from table_name t1 where 1=1 )t2 where t2.rn 》 (page-1)* page_size and t2.rn 《= page * page_size;
网上很多人说oracle 11g在处理大数据分页时用rowid比rownum效率快很多,求rowid和rownum分页效率原理
rownum和rowid是两种不同的东西,不知道你如何利用rowid来分页?
rownum是返回的记录编号。rowid可理解为返回记录的实际地址。
当根据rowid访问时相当于不经查询直接取数,用rownum必须经过查询(即数据库里有查询动作)。如果已经知道了rowid再去获取数据和通过rownum计数去获取数据,肯定用rowid快。
实际上,由于oracle不支持的真正的分页查询,所谓分页,是先把数据从数据库中查询出来,然后再把对应页的数据返回给调用者,剩余的数据扔掉了。所以,这种情况下,注定用rowid不如用rownum快。
为什么oracle一定要使用三层嵌套进行分页查询
楼主您好
因为rownum为查询出结果后才加入序号生成的伪列,必须从1开始,所以只能用小于某个正整数或者等于1才会有结果,然后把这个伪列取别名作为一个子查询的实列,此时就可以嵌套用大于某个值实现分页,建议楼主查一下rownum的理解