SQL 调优概览 
=============================

SQL 调优是指通过综合分析 SQL 的执行计划、执行监控信息、系统配置、系统负载等多方面因素，调整 SQL 的执行策略，以实现资源利用最大化。

SQL 调优方式一般可分为单条 SQL 调优和系统 SQL 调优。

单条 SQL 调优 
------------------------------

单一的 SQL 调优的优化主体是被调试的 SQL 执行本身，一般调优的目标包括该 SQL 的执行时间、试行期的资源消耗等。常见的调优手段包括调整访问路径、执行顺序、逻辑改写等。

针对单条 SQL 的执行计划性能调优又可以分为单表访问和多表访问两种场景。


| **场景** |                                                                                                                                                    **SQL 调优的关注点**                                                                                                                                                     |
|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 单表访问   | * 访问路径是否开启索引扫描：使用索引扫描可以减小数据的访问量。   * 是否创建合适的索引：使用索引排序以减少排序或聚合等耗时操作。   * 分区裁剪是否正确：适当的分区条件可以减少不必要的分区访问。   * 是否提高查询的并行度：分区数目较多时，通过提高并行度以更多资源的代价获取单条 SQL 查询的性能提升。    |
| 多表访问   | 不仅要关注单表的 SQL 调优问题，还要关注多表间的联接问题： * 联接顺序   * 联接算法   * 跨机或并行联接的数据再分布方式   * 查询改写                                                                     |



系统的 SQL 调优 
-------------------------------

系统的 SQL 调优的目的是提高整个系统的吞吐量或者系统利用率等。系统的 SQL 调优过程往往需要结合多条 SQL 的执行计划，综合分析当前系统的负载特征，主要关注热点行竞争、buffer cache 命中率等全局性的调优点。

针对吞吐量的性能调优主要是考虑在一定资源（CPU、IO、网络等）情况下，将数据库系统处理请求量最大化。主要关注以下几个方面：


|     **主要方法**      |                                                                                                                                                                                    **说明**                                                                                                                                                                                    |
|-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 优化慢 SQL           | 找到具体的慢 SQL 后，针对单条 SQL 进行性能调优，请参见示例 [查询某段时间内执行时间排名 TOP N 的请求](../../12.sql-optimization-guide-1/4.sql-optimization-1/3.monitor-sql-execution-performance-1/4.sql-performance-analysis-example-1/8.query-the-top-n-requests-with-the-most-execution-time-1.md)。                                                                                                                                                                                                                                                                   |
| 均衡 SQL 的请求流量资源    | 请参见示例 [查看集群 SQL 请求流量是否均衡](../../12.sql-optimization-guide-1/4.sql-optimization-1/3.monitor-sql-execution-performance-1/4.sql-performance-analysis-example-1/6.check-whether-the-sql-request-traffic-is-balanced-1.md)。 影响均衡的因素主要有： * `ob_read_consistency` 如何设置   * Primary Zone 如何设置   * Proxy 或 Java 客户端路由策略相关设置   * 业务热点查询分区是否均衡    |
| 均衡子计划的 RPC 请求流量资源 | 请参见示例 [查看分布式子计划 RPC 执行数是否均衡](../../12.sql-optimization-guide-1/4.sql-optimization-1/3.monitor-sql-execution-performance-1/4.sql-performance-analysis-example-1/12.check-whether-the-number-of-distributed-rpc-executions-is-balanced-1.md)。 影响子计划请求是否均匀的主要因素如下： * OBServer 内部路由策略相关设置   * 业务热点查询的分区是否均衡                                                                                                                    |


