`
acw2000
  • 浏览: 14508 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

优化统计查询

 
阅读更多
假设我们现在有两张数据库表,分别是customer表和order表,它们的结构如下:

  customer

  ID varchar2(14)

  age number(10)

  name varchar2(20)

  order

  ID varchar2(14)

  order_number number(10)

  customer_ID varchar2(14)

  现在有两条HQL查询语句,分别如下:

  from Customer c inner join c.orders o group by c.age;(1)

  select c.ID,c.name,c.age,o.ID,o.order_number,o.customer_ID

  from Customer c inner join c.orders c group by c.age;(2)

  这两条语句使用了HQL语句的内连接查询(我们将在HQL语句的连接查询部分专门讨论),现在我们可以看出这两条查询语句最后所返回的结果是一样的,但是它们其实是有明显区别的,语句(1)检索的结果会返回Customer与Order持久化对象,而且它们会被置于Hibernate的Session缓存之中,并且Session会负责它们在缓存中的唯一性以及与后台数据库数据的同步,只有事务提交后它们才会从缓存中被清除;而语句(2)返回的是关系数据而并非是持久化对象,因此它们不会占用Hibernate的Session缓存,只要在检索之后应用程序不在访问它们,它们所占用的内存就有可能被JVM的垃圾回收器回收,而且Hibernate不会同步对它们的修改。

  在我们的系统开发中,尤其是Mis系统,不可避免的要进行统计查询的开发,这类功能有两个特点:第一数据量大;第二一般情况下都是只读操作而不会涉及到对统计数据进行修改,那么如果采用第一种查询方式,必然会导致大量持久化对象位于Hibernate的Session缓存中,而且Hibernate的Session缓存还要负责它们与数据库数据的同步。而如果采用第二种查询方式,显然就会提高查询性能,因为不需要Hibernate的Session缓存的管理开销,而且只要应用程序不在使用这些数据,它们所占用的内存空间就会被回收释放。

  因此在开发统计查询系统时,尽量使用通过select语句写出需要查询的属性的方式来返回关系数据,而避免使用第一种查询方式返回持久化对象(这种方式是在有修改需求时使用比较适合),这样可以提高运行效率并且减少内存消耗。㊣真正的高手并不是精通一切,而是精通在合适的场合使用合适的手段。


N+1次查询的问题

执行条件查询时,iterate()方法具有著名的 “n+1”次查询的问题,也就是说在第一次查询时iterate方法会执行满足条件的查询结果数再加一次(n+1)的查询。但是此问题只存在于第一次查询时,在后面执行相同查询时性能会得到极大的改善。此方法适合于查询数据量较大的业务数据。

但是注意:当数据量特别大时(比如流水线数据等)需要针对此持久化对象配置其具体的缓存策略,比如设置其存在于缓存中的最大记录数、缓存存在的时间等参数,以避免系统将大量的数据同时装载入内存中引起内存资源的迅速耗尽,反而降低系统的性能!!!


结果集的使用:
     结果集的使用:list()和iterator()区别
查询方式:
list只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但是list查出的对象会写入二级缓存,但它一般只生成较少的sql语句,很多情况就是一条。
iterator则利用二级缓存,对于一条查询语句,它会先从数据库中找到所有符合条件的记录的ID,在通过ID去缓存找,对于缓存中没有的记录,在构造语句从数据库查出,第一次的执行会产生N+1条SQL语句。
产生结果:
用list可能会溢出
通过Iterator,配合缓存管理API,在海量数据查询中可以很好的解决内存问题。
综合考虑:
一般List会填充二级缓存,却不能利用二级缓存,而Iterator可以读二级缓存,然而无法命中的话,效率很低效。一般处理方法,就是第一次查询使用list,随后使用iterator查询。
分享到:
评论

相关推荐

    江苏联通综合营帐系统查询统计优化应用方案

    随着业务的发展,系统面临着性能优化、查询统计提升、个性化服务支持、数据接口效率改进以及数据深度分析等一系列挑战。 为解决这些问题,江苏联通采用了DSG SmartE架构来优化其企业信息系统平台。DSG SmartE架构的...

    数据库查询优化算法

    数据库查询优化是数据库管理系统中的关键环节,其目的是在满足用户查询需求的同时,尽可能地提高查询效率,减少资源消耗。在数据库领域,有三种经典的查询优化算法:基于成本的优化、基于规则的优化以及动态规划优化...

    sqlserver 2008 统计信息优化

    例如,在`TestApproverMemberUpdate`功能模块的更新操作中,通过优化统计信息和索引,查询执行时间从49000毫秒降低到14000毫秒,效率提升显著。 总结来说,SQL Server 2008的统计信息优化主要涉及以下几个关键点: ...

    数据库查询优化论文

    1. **统计信息收集**:定期收集数据库统计信息,用于估算查询成本,指导优化决策。 2. **动态规划算法**:采用动态规划算法来寻找最优的查询执行计划。 3. **多阶段优化**:将优化过程分为多个阶段,逐步细化执行...

    ORACLE 数据库的统计数据及优化

    本文将重点探讨Oracle数据库中的统计数据及其优化策略,特别是通过使用`dbms_stats`包来提升SQL查询性能。 #### 二、Oracle数据库的统计数据 统计数据是指Oracle数据库中关于表、索引等对象的数据分布信息。这些...

    Oracle 多表查询优化

    成本优化器会根据表的统计信息、索引、约束等因素来确定最优的连接顺序。 为了提高多表连接的效率,数据库管理员需要关注以下几个方面: 1. 选择最有效率的表名顺序 在 Oracle 中,多表连接的效率取决于表的顺序...

    从统计数据表记录总数谈SQL Server查询优化.pdf

    在深入了解SQL Server查询优化的过程中,统计信息起到了至关重要的作用。本文将围绕统计数据表记录总数与SQL Server查询优化之间的关系展开讨论,意在为数据库管理者提供一种参考,以便他们能够更有效地优化查询性能...

    Postgres查询优化方案

    7. **统计信息更新**:保持统计信息的准确性有助于优化查询计划。定期运行ANALYZE命令,更新表和索引的统计信息,让Postgres能更准确地估算查询成本。 8. **慢查询日志**:启用慢查询日志,记录执行时间较长的查询...

    ORACLE多表查询优化

    Oracle 多表查询优化需要考虑多个方面,包括选择合适的表名顺序、使用 Cache Buffer、语句共享、优化查询路径、避免多表连接查询、优化数据统计、选择合适的索引、优化数据库结构、使用 Materialized View、优化...

    MySQL查询优化浅析

    同时,动态统计信息的收集策略有助于提高查询优化器的决策准确性,从而进一步提升查询性能。 总之,理解并掌握MySQL查询优化原理对于提高数据库性能至关重要。通过深入学习和实践,可以更好地利用MySQL提供的强大...

    DB2 优化,db2性能优化,查询优化

    DB2性能优化是一个综合性的过程,涉及到查询优化、并发性管理、系统统计等多个方面。通过对上述关键技术的掌握和实践,可以有效提升DB2数据库的性能表现,满足高并发、大数据量的企业应用需求。

    Sql Server查询优化

    2. 统计信息不精确:如果数据库中的统计信息过时或不准确,查询优化器可能无法做出最佳的查询执行计划,进而影响查询性能。 3. 编写不当的查询:即使数据库设计得很好,但是编写效率低下的查询同样会导致性能问题。...

    Oracle查询优化改写 技巧与案例.pdf

    Oracle查询优化是数据库管理中的重要环节,它直接关系到数据库的性能和响应速度。针对Oracle数据库的查询优化,本文件提供了丰富的技巧和案例分析,以帮助读者深入理解优化原理,并能在实际工作中学以致用。 首先,...

    数据库原理(关系查询处理和查询优化)

    由数据库管理系统自动优化查询有很多好处,如用户无需考虑执行效率,系统能利用数据字典中的统计信息做出更优决策,且当数据库结构变化时,系统能自动调整优化策略,避免了手动修改程序的繁琐工作。 查询优化的目标...

    基于统计方法的Hive数据仓库查询优化实现

    相应研究贡献包括2部分,首先针对应用极广的GroupBy查询和Join查询建立了运行估价模型,确定了不同场景下查询计划的优化选择分支;其次基于Hive ETL机制设计了一种统计信息收集方法,解决了统计海量数据分布特征的问题....

    ORACLE中SQL查询优化技术

    - **索引统计信息更新**:定期更新索引统计信息可以帮助Oracle优化器更准确地评估查询成本。 ##### 2. 调整SQL语句结构 - **避免SELECT ***:明确指定需要查询的字段而不是使用`SELECT *`,以减少不必要的数据传输...

    【oracle】oracle查询优化改写

    查询优化是性能优化的核心部分,它涉及到如何以最有效的方式执行SQL查询,从而提高数据检索的速度并减少系统资源的消耗。在Oracle中,查询优化主要依赖于查询改写和优化器的选择。 查询改写是Oracle数据库优化策略...

    查询的处理与优化原理

    查询处理和优化是数据库管理系统中非常关键的技术,尤其是在像Oracle这样的复杂关系型数据库中。在执行数据库查询时,系统首先需要将用户的查询(通常是以SQL语句的形式)转化为物理操作,然后执行这些操作来获取...

    《Oracle查询优化改写技巧与案例》PDF版本下载.txt

    - **统计信息更新**:定期更新表和索引上的统计信息,确保查询优化器能够做出更准确的决策。 #### 2.2 连接优化 - **连接顺序**:根据表大小和数据分布调整连接顺序,优先处理较小的表或已过滤的表。 - **连接类型*...

Global site tag (gtag.js) - Google Analytics