`

oracle count 百万级 分页查询记录总数、总条数优化

阅读更多

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条件中进行优化。特别注意条件字段查询前后顺序。

    具体优化请参考

1.浅析Oracle语句优化规则

http://www.cnblogs.com/Automation_software/archive/2011/01/21/1940883.html

分享到:
评论

相关推荐

    oracle分页查询并返回总记录数据存储过程

    本文将详细介绍如何在 Oracle 中创建一个用于分页查询并返回总记录数的存储过程。 #### 核心概念 1. **存储过程**:存储在数据库中的可编程对象,可以接受参数、执行操作、返回结果。 2. **分页**:通过限制查询...

    Oracle数据访问 获取记录总数

    在IT行业中,数据库管理系统是核心组件之一,Oracle作为全球知名的关系型数据库管理系统的代表,广泛应用于各类企业级应用。在开发应用程序时,我们经常需要与数据库进行交互,获取记录总数是一项基本但至关重要的...

    Oracle分页查询(很不错的介绍)

    它先计算出总记录数,然后根据页码和页面大小确定起始和结束行号,最后执行分页查询并打开游标供外部调用者使用。 在实际应用中,分页查询需要考虑性能优化。例如,可以使用索引来加速查询,避免全表扫描。同时,...

    Oracle分页详解

    5. **p_OutRecordCount**: 输出参数,用于返回查询结果的总记录数。 6. **p_OutCursor**: 输出参数,返回的结果集游标。 #### 四、分页查询构造 - **v_heiRownum** 和 **v_lowRownum** 的计算:这两个变量分别表示...

    Oracle分页存储过程

    首先构造统计查询语句`v_count_sql`,计算满足条件的记录总数,然后根据总数计算出总页数`p_pagecount`。接着,根据当前页码和每页记录数构建具体的分页查询语句`v_select_sql`。 对于第一页的查询,只需简单地添加...

    oracle 存储过程分页

    2. **计算总页数**:根据记录总数和每页显示的条数计算出总页数。 3. **校验当前页码**:如果当前页码大于总页数,则将其设置为总页数。 4. **构建分页SQL**:根据当前页码和每页显示的条数,构建出分页查询的SQL...

    SQL Server 在分页获取数据的同时获取到总记录数

    SQL Server 获取数据的总记录数,有两种方式: 1.先分页获取数据,然后再查询一遍数据库获取到总数量 2.使用count(1) over()获取总记录数量 SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY Id DESC) rn, ...

    ORACLE-基于包的存储过程动态分页

    3. **计算分页信息**:计算出总记录数、总页数以及当前页码所对应的起始记录位置和结束记录位置。 4. **执行查询**:使用ROWNUM和子查询的方法来获取当前页的数据,并通过游标返回结果。 #### 总结 通过上述存储...

    ORACLE存储过程分页

    `P_COUNT`存储过程用于获取满足特定条件的记录总数,这对于实现完整的分页功能至关重要,因为前端通常需要知道总页数以便正确渲染页面导航。 - `V_COUNT OUT NUMBER`:输出参数,用于返回满足条件的记录总数。 - `V...

    Oracle中使用存储过程实现分页.docx

    此过程用于计算总记录数,它接收一个SQL语句`Psqlcount`,执行这个SQL获取记录总数,并将结果存储在`Prcount`输出参数中。这在分页时很有用,因为我们需要知道总共有多少页。 在.NET环境中,这些存储过程可以被...

    oracle 分页包

    - `p_SqlCount`: 用于计算总记录数的SQL查询语句,通常只包含COUNT(*)子句。 - `p_OutRecordCount`: 输出参数,返回所有符合条件的记录总数。 - `p_OutCursor`: 输出参数,返回一个包含分页结果的游标。 - **...

    oracle数据库分页

    - **总记录数 (p_totalRecords)**:满足查询条件的所有记录总数。 - **总页数 (p_totalPages)**:根据总记录数和每页记录数计算得出。 #### 三、Oracle存储过程实现分页查询 下面通过具体的存储过程代码来实现上述...

    Oracle使用MyBatis中RowBounds实现分页查询功能

    `RowBounds`是MyBatis提供的一种简单的分页实现,它只需要两个参数:`offset`(偏移量,即从第几条记录开始)和`limit`(每页记录数)。在Java代码中,我们可以通过这两个参数来构建`RowBounds`对象,并将其传递给...

    jsp实现对查询后的数据进行分页,非常的灵活

    3. **计算总页数**:在获取了所有记录总数(可以通过COUNT(*)实现)和每页大小之后,总页数可以通过总数除以每页大小得到。如果余数不为0,则总页数应加1。 4. **创建分页工具类**:为了代码的复用性和可维护性,...

    分页存储过程 oracle sql

    例如,在Web开发中,当用户请求一个包含数千条记录的产品列表页面时,通常不会一次性加载所有记录,而是按照每页显示10条或20条记录的方式进行分页展示。这种方式不仅能够加快页面加载速度,还能够使数据展示更加...

    Oracle查询总结与优化

    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(*) ...

    数据库的分页查询.doc

    通常,分页查询涉及到两个主要步骤:计算总记录数和根据当前页获取数据。 第一步是计算记录总数。这通常通过执行一个COUNT(*)查询来完成,该查询基于用户设定的查询条件,例如WHERE子句。这样做是为了知道总共有...

    oracle常用经典sql查询

    本资源“oracle常用经典sql查询”汇集了Oracle环境中的一些常见且实用的SQL查询语句,帮助用户提高数据库操作效率。以下是对这些经典查询语句的详细解读: 1. **基本查询操作** - `SELECT * FROM table_name;`:这...

    JSP查询分页精华版

    - **计算总记录数**:首先,我们需要从数据库获取所有符合条件的记录总数,这通常通过SQL的`COUNT(*)`函数完成。 - **设定每页显示数量**:确定每一页要显示的记录条数,这可以根据实际需求和数据量进行调整。 - *...

    oracle9i讲课课件包括实验\oracle课件\上课\005-7高级查询技术

    6. **分页查询**:通过使用ROWNUM伪列和子查询,我们可以实现分页效果,例如只返回特定范围的记录,这对于大数据量的查询非常实用。 7. **游标**:游标是处理单个数据行的机制,允许用户按需遍历查询结果集,这对于...

Global site tag (gtag.js) - Google Analytics