#应用性能调优

# 系统架构

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

硬件架构

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

  • 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"。

pdf-btn 下载文档
copy-btn 复制链接