前一段时间做了某产品实时统计的报表,这周在对报表性能进行优化。
其中逐步积累了一些优化经验,总结一下记录下来,欢迎大家一起探讨。
本文仅限于探讨单个数据库的查询sql及统计报表调优,不涉及分布式数据库架构或垂直、水平扩展等知识。
(本文中的统计数据库为Mysql)
一、SQL调优:
1、提升统计查询性能,首当其冲当然还是对查询SQL进行优化,说到SQL调优,不得不先说一下Mysql里SQL的执行顺序。网上查了一些资料,引用如下:
from -> (on -> join ->) where -> group by -> 聚集函数计算 -> having -> 计算所有表达式 -> order by -> limit
2、SQL调优的基本思想:
Sql所需处理的资源总量/Sql单位时间所能处理的资源量=Sql执行时间
(引用自:http://blog.163.com/hs_admin_jsjd/blog/static/175159035201031705956983/)
所以为减少Sql执行时间:
(1)可以增大Sql单位时间所能处理的资源量。
(2)可以减少Sql所需处理的资源总量。
要实现方法(1)一般需要提升硬件处理能力或对RDBMS进行优化。因此我们这里主要讨论方法(2)。即减少Sql所需处理的资源总量,就是减少执行sql所处理的行数。
3、如何减少Sql执行时所处理的行数?
参考了这个人下面的几篇blog,在实际工作中感觉确实比较有帮助,特此记录一下。
http://hideto.iteye.com/blog/218584 SQL性能调优(共3篇)
二、关于索引
经过了以上的SQL调优,查询的速度应该已经提升了不少,但是随着库表中的数据日渐增多,简单的SQL调优可能已经无法满足性能的需求,此时可以通过对表添加索引来加快查询速度。本次在优化过程中同样建立了索引和组合索引。下面是一些概念:
1、什么是索引?
索引类似于书的目录,主要用于提高查询效率,也就是按条件查询的时候,先查询索引,再通过索引找到相关的数据,索引相当于记录了对某个关键词,指定到不同的文件,或者文件里的不同位置,当然索引自身也是通过文件来保存的。(本段来源于网络)
2、建立索引。
但是同样不要超出需求创建索引,DBMS在插入、更新或删除行之后必须更新索引。随着表索引的增长,DBMS要花费越来越多的时间维护索引,行的修改速度也会越来越慢。
引用一列的索引称为简单索引,引用多列的索引称为组合索引。列的顺序在组合索引中是重要的。组合索引只作用于定义它的那组列,并非分别作用于每个列或相同列地其他顺序。
以上可以参考我另外一篇blog:http://shensy.iteye.com/blog/1486869 里面记录了一些关于使用索引的知识点。
3、关于索引类型(概念总结来源于网络)。
两种基本的索引结构,也就是索引文件的保存方式:
一个是顺序索引,就是根据值的顺序排序的(这个文件里面的值,也就是为其建索引的字段值,是顺序的放在索引文件里面)。
另外一个是散列索引,就是将值平均分配到若干散列桶中,通过散列函数定位的。
顺序索引中如果被索引的字段本身按照一定的顺序排序,那么这种索引叫做聚集索引,否则叫做非聚集索引。
如果被索引的字段的每个值都有一个索引与其对应,那么这种索引叫做稠密索引,否则叫做稀疏索引。
顺序索引分为两类,单级索引(不怎么用)和多级索引(通常是B+树,大量使用)。
B+树最常用,性能也不差,用于范围查询和单值查询都可以。特别是范围查询,非得用B+树这种顺序的才可以了。
HASH的如果只是对单值查询的话速度会比B+树快一点,但是ORACLE好像不支持HASH索引,只支持HASH表空间。
(参考资料:http://blog.csdn.net/coolzyt/article/details/4085678)
三、关于统计报表的性能优化
一般来说统计报表的查询SQL计算和关联关系都比较复杂,如果真的一句Sql查询出一张报表所需要的结果集其实是很耗时的(原来自己就干过这种事,一句Sql几十行,汗...)。其实对于报表,可以采用如下方法调优:
1、分页处理:
在左连接或子查询的最内层查询中使用LIMIT限制结果集大小,最大程度的保证后面对小结果集进行操作。
2、只查询基础数据:
在统计报表的查询SQL中有很多表达式计算或者需要连接多张其它表时,可以只查出需要计算的列后使用程序在内存中计算,或者只查出关联Id后,在程序中使用该Id到另一张表里再查一次(也方便使用Cache,见下文)。这样确实比一句Sql关联出所有结果集更快。
3、使用Cache:
如果分页后的结果集数量还是比较大,例如100条记录每页。那么如果将这100条记录中的某id拿出来到另外一张关联表里查一次的话,也就需要查100次,这其实也是比较耗时间的。即使用连接池进行单表sql查询,实践发现总用时也在1秒以上,毕竟每次重新连接也要消耗时间。所以,这里可以使用一些<K,V>的缓存来减少到数据库中查询的次数,例如memcached或redis等...但是这也加大了程序的复杂度,比如设计缓存粒度的大小(对某列缓存还是对整个报表结果缓存)、同步缓存内容的时机以及失效时间等多方面的问题。不过如果使用得当的话,确实可以提升不少统计报表的查询性能。
4、尽量不使用跨库join:
在Mysql中提供了一个跨库join的功能,就是查询sql中将表名前面加数据库名:dbname.tablename的形式,即可关联另外一个数据库中的表了。这个跨库join对于那些sql简单且表数量小的查询确实很方便,但是对于数据量大的表,而且比较复杂的SQL查询就比较费时了,不建议使用。实际工作中我使用了定时程序把另外一个库表中需要的列加载到统计库的一张表内,然后再直接join统计库中的表来实现避免跨库join。
PS:
SQL优化续篇 http://shensy.iteye.com/blog/1887786
相关推荐
数据库层优化主要包括两个方面:实例性能优化和SQL语句性能优化。实例优化涉及内存配置、后台进程调整和初始化参数设置,以确保数据的高效读写和处理。SQL优化则侧重于通过分析SQL执行计划,识别慢查询并应用索引、...
帆软报表查询性能SQL分析插件是一款专门针对帆软报表系统的增强工具,旨在提升报表查询效率和性能优化。此插件能够深入解析SQL查询过程,帮助用户识别并解决潜在的性能瓶颈,确保报表的快速准确生成。以下是关于这款...
由于提供的文件信息中,大部分内容是关于PDF电子书资料下载的广告信息,并非关于“T-SQL性能调优秘笈 基于SQL Server 2012窗口函数”的内容,因此在不违反您的要求的前提下,这部分广告信息不会被转化为知识点。...
整个SQL Server 2017性能调优实验手册围绕性能调优的各个方面展开,从安装配置到实验设计,再到性能监控和优化,都有详尽的指导和案例分析。掌握这些知识对于数据库管理员来说是至关重要的,可以帮助他们更有效地...
SQL 优化是 SAP 系统性能调优的重要部分,包括 For all entries in、执行顺序、索引等多个方面。正确的索引和字段顺序可以大大提高 SQL 语句的执行效率。 多进程处理是 SAP 系统性能调优的另一个重要方面,包括 SAP...
Cognos报表性能调优是针对IBM Cognos产品进行的一项重要工作,其目的在于提升报表的运行效率和用户体验。在进行性能调优时,通常涉及多个层面的优化,包括服务器配置、报表设计以及数据库层面的调优。以下是一些详细...
Oracle 10g版本引入了一个重要的性能监控工具——Automatic Workload Repository(AWR),它是数据库管理员进行性能优化的重要参考。AWR通过定期捕获数据库的状态快照(snapshot),然后对比这两段时间内的数据,...
5. **报表生成**:生成SQL性能报告,帮助团队了解SQL优化的进展和效果,便于持续改进。 6. **易于使用**:SOAR通常通过命令行工具进行操作,具有友好的交互界面和丰富的参数设置,适合数据库管理员和开发人员日常...
**七、性能优化与扩展** 为保证报表服务在高并发环境下稳定运行,需要进行性能调优。这包括优化查询、合理配置服务器资源、使用缓存策略以及考虑使用 Reporting Services Scale-out 部署模式以提高处理能力。 **八...
- **应用最常见的RAC优化技巧**:掌握一套实用的优化技巧,包括但不限于SQL调优、资源管理等。 - **使用集群数据库性能页**:利用Oracle Enterprise Manager中的性能页面来监控和分析RAC环境下的性能。 - **在RAC中...
2.1 SQL调优时间都去哪儿了 25 2.1.1 不善于批处理频频忙交互 25 2.1.2 无法抓住主要矛盾瞎折腾 25 2.1.3 未能明确需求目标白费劲 26 2.1.4 没有分析操作难度乱调优 26 2.2 如何缩短SQL调优时间 27 2.2.1 先...
MySQL数据库在处理大量数据插入时,性能优化是至关重要的,尤其是在报表系统等需要频繁批量插入数据的应用场景。以下是一些针对MySQL批量SQL插入的性能优化策略: 1. **批量插入数据** - 传统的做法是逐条插入数据...
### SQL Server 性能优化综述 #### 一、引言 随着信息技术的快速发展与企业对数据处理能力需求的增长,数据库性能优化已成为保障系统稳定高效运行的重要环节之一。本文将结合实践经验,对SQL Server数据库性能优化...
在IT领域,SQL性能分析是数据库管理中的关键环节,它涉及到如何有效地运行...记住,性能优化是一个持续的过程,需要定期评估并调整策略以适应不断变化的业务需求。希望这些信息能帮助你在SQL性能分析的道路上更进一步。
- **优化SQL查询**:使用手写的SQL语句替换复杂的查询逻辑,提高查询效率。 - **调整过滤条件顺序**:将过滤条件按数据量从小到大排序,优先过滤出较小的数据集。 - **调整查询字段和表的顺序**:合理安排查询字段和...
本文档通过一个具体的性能优化案例来阐述业务库和报表库分离的重要性及其实施过程。在案例中,一个企业的核心业务系统由于报表查询频繁且复杂,导致业务操作响应速度变慢,用户体验下降。通过对系统性能的监控和分析...
MySQL批量SQL插入性能优化是数据库管理员和开发人员关注的重要议题,尤其是在处理大数据量时。针对描述中的内容,本文将详细探讨几种提升MySQL插入性能的方法,适用于处理报表系统等需要大量数据导入的场景。 1. **...
本文将详细介绍SQL Server 2008 R2 的监视与调优解决方案,包括性能调优的方法学、架构设计、查询优化、索引优化、并发控制、存储优化以及服务器优化等方面。 #### 二、性能调优的方法学 ##### 调优顺序 - **最...
在本课程中,我们将深入探讨SQL Server 2008在商业智能(BI)解决方案方面的性能优化技巧。作为BI解决方案提升Top10系列的第一部分,本课程的重点是提高查询速度和整体系统性能,以实现更高效的数据库管理和数据分析...