#应用性能调优
# 系统架构
桥梁设计中桥梁的强度取决于最薄弱的部分,性能设计与之类似,应用系统自顶向下的每一层组件都需要满足性能要求。用户需要考虑不同的负载场景来设计不同组件的架构,主要包含硬件架构和软件架构两部分。
硬件架构
与数据库性能相关的硬件架构,在设计时应该主要考虑以下几个因素:
- CPU:决定数据库的执行能力和并行处理能力。
- MEMORY:数据库使用大量的内存来缓存数据,以减少I/O访问。
- I/O:不同磁盘性能差异很大,有些磁盘还可以提供容错能力,需要根据数据库的需求来选择。
- NETWORK:决定数据库的通讯效率,需重点关注带宽和迟延。
软件架构
通常情况下,应用系统都包含以下软件组件:
- 用户接口
- 业务逻辑
- 资源管理
- 事务处理
用户在设计这些软件组件时,也应当考虑数据库的性能,原则是尽量降低数据库压力。
# 应用设计原则
数据模型设计
应用通过创建数据库表规划设计业务的数据模型与关系。不合理的数据模型设计,会对数据库的性能产生很恶劣的影响,后期也很难通过SQL来优化。在设计YashanDB的数据模型时,通常需要注意以下几点:
选择合适的表类型:
对于海量稳态数据的分析业务,建议使用LSC表,通过稀疏索引、条件下推、数据压缩等关键技术,实现极致的查询性能。
对于实时分析的业务场景,可以选择TAC表,TAC表支持索引,支持in-place update,拥有向量化计算能力,可实现数据的快速更新和查询。
对于交易性的业务场景,可以选择HEAP表,实现高并发在线事务处理的极致性能。
建立合理的索引:
合理设计索引列,避免表上的列被多个索引反复包含。
创建联合索引时要注意字段排列顺序,把过滤最多记录数的字段放在第一位。
选择合理的数据类型:
选择更“小”的数据类型,例如INT类型会比NUMBER类型的性能更高。
选择合适的数据类型,例如对于字符型,如果数据的长度差异比较大,建议使用VARCHAR,节约空间且对IO压力小;如果数据都是定长或非常接近,建议使用CHAR,将有特殊的性能优化效果。
选择合理的表分区属性:
YashanDB支持哈希分区、范围分区、列表分区。
通过分区剪枝的特性,在数据访问时可以快速过滤数据,大大减少访问的数据量,提升性能。
通过分区特性,可以更好地提升并行扫描的能力。
分布式部署中选择合理的表分布属性:
对于数据量不大的表,可以考虑创建为复制表,减少跨节点Join。
根据数据分布和访问的均衡度考虑确定分区键,可以充分利用各数据节点资源,提升性能。
充分利用分布剪枝的特性,该特性在数据访问时可以快速过滤数据,大大减少访问的数据量,提升性能。
系统开发架构设计
在任何系统的设计和架构搭建阶段,都应该确保开发人员充分关注SQL的执行效率。
系统开发架构需要遵循以下建议:
良好的数据库连接管理:
建立数据库连接的代价非常高,而且扩展性很差。因此,应用程序对数据库的并发连接数应该尽可能的少。 对于高并发的系统,应确保数据库连接被池化,通过数据库连接池复用连接,而不是每次用户请求都重新建立。
良好的游标使用和管理:
减少SQL解析和维护数据库连接同样重要。SQL解析通常包含语法解析、语义分析、语法检查、查询重写和查询优化等阶段,解析产生的执行计划将被存储到shared pool中。SQL解析分为硬解析和软解析:
硬解析:硬解析表示一个SQL提交后,在shared pool中没有找到该语句的执行计划缓存,此时数据库将完整地执行SQL解析、分析和检查等操作。硬解析非常消耗资源。
软解析:软解析表示一个SQL提交后,在shared pool找到了上次的执行计划缓存,此时数据库将直接使用缓存去执行SQL语句,可直接省去解析、分析和检查等步骤,提升了性能。
解析次数应尽可能的少,因此开发者需要设计出能够一次解析、多次执行的SQL程序。通常做法是使用绑定参数替换SQL中每次执行都会变化的部分,而不是直接使用变化的字符串拼接SQL。否则,SQL语句重用概率低,可能解析后不会再被其他用户重用。
例如,在程序中应避免使用字符串常量SQL:"SELECT * FROM AREA WHERE AREA_NAME = 'Beijing'",而应该使用绑定变量的SQL:"SELECT * FROM AREA WHERE AREA_NAME = :1"。