oracle count 百万级 查询记录总数、总条数优化
最近做一个项目时,做分页时,发现分页查询速度很慢,分页我做的是两次查询,一次是查询总数,一次是查询分页结果
/** 查询总记录数 **/
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) */ 来提高查询效果。
听说这个就是强制使用索引统计结果?如果有哪位大虾能把原理详细告诉我,请来多多指点!
SELECT /*+ROWID(USER)*/ count(*) FROM USER t
或者
SELECT /*+ INDEX(USER ID) */ count(*) FROM USER t
使用后,单条统计总数的查询在800ms左右,分页查询结果基本在900ms~950ms之间,基本在一秒之内,达到了当初设计需求。
当然,这个是没有加查询条件的,当把查询条件加入后,不管前面加不加强制索引,结果时间都在2000ms之间,所以,如果要进行有条件的查询,就要在where条件中进行优化。特别注意条件字段查询前后顺序。
具体优化请参考
http://www.cnblogs.com/Automation_software/archive/2011/01/21/1940883.html
分享到:
相关推荐
本文将详细介绍如何在 Oracle 中创建一个用于分页查询并返回总记录数的存储过程。 #### 核心概念 1. **存储过程**:存储在数据库中的可编程对象,可以接受参数、执行操作、返回结果。 2. **分页**:通过限制查询...
在IT行业中,数据库管理系统是核心组件之一,Oracle作为全球知名的关系型数据库管理系统的代表,广泛应用于各类企业级应用。在开发应用程序时,我们经常需要与数据库进行交互,获取记录总数是一项基本但至关重要的...
它先计算出总记录数,然后根据页码和页面大小确定起始和结束行号,最后执行分页查询并打开游标供外部调用者使用。 在实际应用中,分页查询需要考虑性能优化。例如,可以使用索引来加速查询,避免全表扫描。同时,...
5. **p_OutRecordCount**: 输出参数,用于返回查询结果的总记录数。 6. **p_OutCursor**: 输出参数,返回的结果集游标。 #### 四、分页查询构造 - **v_heiRownum** 和 **v_lowRownum** 的计算:这两个变量分别表示...
首先构造统计查询语句`v_count_sql`,计算满足条件的记录总数,然后根据总数计算出总页数`p_pagecount`。接着,根据当前页码和每页记录数构建具体的分页查询语句`v_select_sql`。 对于第一页的查询,只需简单地添加...
2. **计算总页数**:根据记录总数和每页显示的条数计算出总页数。 3. **校验当前页码**:如果当前页码大于总页数,则将其设置为总页数。 4. **构建分页SQL**:根据当前页码和每页显示的条数,构建出分页查询的SQL...
SQL Server 获取数据的总记录数,有两种方式: 1.先分页获取数据,然后再查询一遍数据库获取到总数量 2.使用count(1) over()获取总记录数量 SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY Id DESC) rn, ...
3. **计算分页信息**:计算出总记录数、总页数以及当前页码所对应的起始记录位置和结束记录位置。 4. **执行查询**:使用ROWNUM和子查询的方法来获取当前页的数据,并通过游标返回结果。 #### 总结 通过上述存储...
`P_COUNT`存储过程用于获取满足特定条件的记录总数,这对于实现完整的分页功能至关重要,因为前端通常需要知道总页数以便正确渲染页面导航。 - `V_COUNT OUT NUMBER`:输出参数,用于返回满足条件的记录总数。 - `V...
此过程用于计算总记录数,它接收一个SQL语句`Psqlcount`,执行这个SQL获取记录总数,并将结果存储在`Prcount`输出参数中。这在分页时很有用,因为我们需要知道总共有多少页。 在.NET环境中,这些存储过程可以被...
- `p_SqlCount`: 用于计算总记录数的SQL查询语句,通常只包含COUNT(*)子句。 - `p_OutRecordCount`: 输出参数,返回所有符合条件的记录总数。 - `p_OutCursor`: 输出参数,返回一个包含分页结果的游标。 - **...
- **总记录数 (p_totalRecords)**:满足查询条件的所有记录总数。 - **总页数 (p_totalPages)**:根据总记录数和每页记录数计算得出。 #### 三、Oracle存储过程实现分页查询 下面通过具体的存储过程代码来实现上述...
`RowBounds`是MyBatis提供的一种简单的分页实现,它只需要两个参数:`offset`(偏移量,即从第几条记录开始)和`limit`(每页记录数)。在Java代码中,我们可以通过这两个参数来构建`RowBounds`对象,并将其传递给...
3. **计算总页数**:在获取了所有记录总数(可以通过COUNT(*)实现)和每页大小之后,总页数可以通过总数除以每页大小得到。如果余数不为0,则总页数应加1。 4. **创建分页工具类**:为了代码的复用性和可维护性,...
例如,在Web开发中,当用户请求一个包含数千条记录的产品列表页面时,通常不会一次性加载所有记录,而是按照每页显示10条或20条记录的方式进行分页展示。这种方式不仅能够加快页面加载速度,还能够使数据展示更加...
p_OutRecordCount out int,--返回总记录数 p_OutCursor out refCursorType) as v_sql varchar2(3000); v_count int; v_heiRownum int; v_lowRownum int; begin ----取记录总数 v_sql := 'select count(*) ...
通常,分页查询涉及到两个主要步骤:计算总记录数和根据当前页获取数据。 第一步是计算记录总数。这通常通过执行一个COUNT(*)查询来完成,该查询基于用户设定的查询条件,例如WHERE子句。这样做是为了知道总共有...
本资源“oracle常用经典sql查询”汇集了Oracle环境中的一些常见且实用的SQL查询语句,帮助用户提高数据库操作效率。以下是对这些经典查询语句的详细解读: 1. **基本查询操作** - `SELECT * FROM table_name;`:这...
- **计算总记录数**:首先,我们需要从数据库获取所有符合条件的记录总数,这通常通过SQL的`COUNT(*)`函数完成。 - **设定每页显示数量**:确定每一页要显示的记录条数,这可以根据实际需求和数据量进行调整。 - *...
6. **分页查询**:通过使用ROWNUM伪列和子查询,我们可以实现分页效果,例如只返回特定范围的记录,这对于大数据量的查询非常实用。 7. **游标**:游标是处理单个数据行的机制,允许用户按需遍历查询结果集,这对于...