#应用性能调优

# 系统架构

桥梁设计中桥梁的强度取决于最薄弱的部分,性能设计与之类似,应用系统自顶向下的每一层组件都需要满足性能要求。用户需要考虑不同的负载场景来设计不同组件的架构,主要包含硬件架构和软件架构两部分。

硬件架构

与数据库性能相关的硬件架构,在设计时应该主要考虑以下几个因素:

  • CPU:决定数据库的执行能力和并行处理能力。
  • MEMORY:数据库使用大量的内存来缓存数据,以减少I/O访问。
  • I/O:不同磁盘性能差异很大,有些磁盘还可以提供容错能力,需要根据数据库的需求来选择。
  • NETWORK:决定数据库的通讯效率,要重点关注带宽和迟延。

软件架构

通常情况下,应用系统都包含以下软件组件:

  • 用户接口
  • 业务逻辑
  • 资源管理
  • 事务处理

用户在设计这些软件组件时,也应当考虑数据库的性能,原则是尽量降低数据库压力。

# 应用设计原则

数据模型设计

应用通过创建数据库表,来规划设计业务的数据模型与关系。不合理的数据模型设计,会对数据库的性能产生很恶劣的影响,后期也很难通过SQL来优化。在设计YashanDB的数据模型时,通常需要注意以下几点:

1.选择合适的表类型:

  • 对于海量稳态数据的分析业务,建议使用LSC表,通过稀疏索引,条件下推,数据压缩等关键技术,实现极致的查询性能。

  • 对于实时分析的业务场景,可以选择TAC表,TAC表支持索引,支持in-place update,拥有向量化计算能力,可实现数据的快速更新和查询。

  • 对于交易性的业务场景,可以选择HEAP表,实现高并发在线事务处理的极致性能。

2.建立合理的索引:

  • 合理设计索引列,避免表上的列被多个索引反复包含。
  • 创建联合索引时要注意字段排列顺序,把过滤最多记录数的字段放在第一位。

3.选择合理的数据类型:

  • 选择更“小”的数据类型,例如INT类型会比NUMBER类型的性能更高。
  • 选择合适的数据类型,例如对于字符串类型,如果数据的长度差异比较大,建议使用VARCHAR,节约空间,且对IO压力小;如果数据都是定长或者非常接近,建议使用CHAR,有特殊的性能优化效果。

4.选择合理的表分区属性:

  • YashanDB支持哈希分区、范围分区、列表分区。
  • 通过分区剪枝的特性,在数据访问的时候可以快速过滤数据,大大减少访问的数据量,提升性能。
  • 通过分区特性,可以更好的提升并行扫描的能力。

5.分布式部署中选择合理的表分布属性:

  • 对于数据量不大的表,可以考虑创建为复制表,减少跨节点Join。
  • 根据数据分布和访问的均衡度考虑确定分区键,可以充分利用各数据节点资源,提升性能。
  • 充分利用分布剪枝的特性,该特性在数据访问的时候可以快速过滤数据,大大减少访问的数据量,提升性能 。

系统开发架构设计

在任何系统的设计和架构搭建阶段,都应该确保开发人员充分关注SQL的执行效率。

系统开发架构需要遵循以下两点建议:

1.良好的数据库连接管理:

建立数据库连接的代价非常高,而且扩展性很差。因此,应用程序对数据库的并发连接数应该尽可能的少。 对于高并发的系统,应确保数据库连接被池化,通过数据库连接池来复用连接,而不是每次用户请求都重新建立。

2.良好的游标使用和管理:

减少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"。