
# 使用并行查询
TaurusDB支持并行查询，您可以通过控制台或Hint语法，为实例开启或关闭并行查询功能。
#### 前提条件
建议云数据库TaurusDB的引擎版本需要为2.0.45.230900及以上。
内核版本的查询方法请参见[如何查看云数据库 TaurusDB实例的版本号](https://support.huaweicloud.com/taurusdb_faq/taurusdb_faq_0141.html)。
#### 使用须知
- 只读节点和主节点均支持并行查询，由于并行查询对计算资源（CPU、内存等）比较消耗，考虑到实例稳定性，云数据库TaurusDB的内核版本为2.0.42.230600及以上时，并行查询默认在主节点不生效，如需使用，请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)。
- 使用了offset或者limit查询，不添加order by条件时，并行执行下返回的结果集顺序可能与非并行不一致，会出现结果集不同的现象，需要添加order by主键或者唯一键来保证结果集正确。
 
#### 并行查询相关系统参数及状态变量
- [系统参数]
  
  表1系统参数 
  | **参数名称**                   | **级别**          | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
  |:---|:---|:---|
  | force_parallel_execute     | Global          | 是否开启并行查询。 - 取值范围： - ON：表示查询SQL尽可能地使用并行执行。  - OFF：关闭并行查询优化。  - AUTO：内核2.0.60.241200版本之后，支持"AUTO"选项。系统会对默认的一些场景使用并行查询优化，对应场景是由pq_support_features_switch参数控制。    - 默认值：OFF   |
  | pq_master_enable           | Global          | 是否在主机开启并行查询，需要与参数force_parallel_execute配合使用。 - 取值范围： - ON：如果force_parallel_execute为ON或AUTO，并行查询在主机生效。  - OFF：表示并行查询在主机不生效。只读节点不受该参数影响。    - 默认值：ON                                                                                                                          |
  | parallel_default_dop       | Global, Session | 并行执行的默认并行度。当查询语句没有指定并行度时，使用该值。 - 取值范围：0-1024  - 默认值：4                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
  | parallel_max_threads       | Global          | 并行执行的最大活跃线程个数。当并行执行的活跃线程超过该值时，新的查询将不允许启用并行执行。 - 取值范围：0-4294967295  - 默认值：CPU核数的2倍，默认值随CPU核数变化。                                                                                                                                                                                                                                                                                                                                                                                                                             |
  | parallel_limit_no_order_by | Global, Session | 控制查询块中有limit子句无order by子句时是否走并行查询。 - 取值范围：ON, OFF  - 默认值：ON                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
  | parallel_cost_threshold    | Global, Session | 启用并行执行的代价阈值。只有当查询的执行代价超过该阈值时才有可能进行并行执行。 - 取值范围：0-4294967295  - 默认值：1000                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
  | parallel_queue_timeout     | Global, Session | 当不满足并行查询的条件时，请求并行执行的SQL等待超时时间。当等待时间超过该值后，则不再等待，开始进行单线程执行。 - 取值范围：0-4294967295  - 默认值：0                                                                                                                                                                                                                                                                                                                                                                                                                                       |
  | parallel_memory_limit      | Global          | 并行执行可用的内存上限。当并行执行使用的内存量超过该值时，新的SQL查询将不会进行并行执行。 - 取值范围：0-4294967295  - 默认值：104857600                                                                                                                                                                                                                                                                                                                                                                                                                                      |
  | parallel_setup_cost        | Global, Session | 启动初始化并行执行的代价。用于估算并行执行的总代价。 - 取值范围：0-1000000000  - 默认值：1000                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
  | parallel_tuple_cost        | Global, Session | 并行执行消息传递单条记录的代价。用于估算并行执行的总代价。 - 取值范围：0-1000000  - 默认值：1.5                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
     
- [状态变量]
  表2状态变量 
  | **变量名**            | **级别** | **描述**                    |
  |:---|:---|:---|
  | PQ_stmt_executed   | Global | 并行查询优化累计生效的次数。            |
  | PQ_threads_running | Global | 当前正在运行的并行执行的总线程数。         |
  | PQ_memory_used     | Global | 当前并行执行使用的总内存量。            |
  | PQ_threads_refused | Global | 由于总线程数限制，导致未能执行并行执行的查询总数。 |
  | PQ_memory_refused  | Global | 由于总内存限制，导致未能执行并行执行的查询总数。  |
     
#### 开启并行查询
支持通过在控制台设置系统参数和使用HINT语法两种方式，开启或关闭并行查询。
- [使用控制台开启]
  在管理控制台的参数修改页面，通过设置[系统参数]，可以全局开启或关闭并行查询，并调整并行度。
  1. [登录TaurusDB管理控制台](https://console.huaweicloud.com/gaussdbformysql/#/management/list)。
  
  2. 单击管理控制台左上角的![](https://support.huaweicloud.com/kerneldesc-taurusdb/figure/zh-cn_image_0000002671347251.png)，选择区域。
  
  3. 进入"实例管理"页面，在实例列表中单击目标实例名称，进入实例概览页面。
  
  4. 在左侧导航栏中单击"参数修改"，进入"参数修改"页面。 
     您还可以在实例概览页面右上角单击![](https://support.huaweicloud.com/kerneldesc-taurusdb/figure/zh-cn_image_0000002318182517.png)，选择"参数修改"，进入参数修改页面。
     
     
  
  5. 设置系统参数，开启并行查询，[表3]的参数在使用过程中，支持动态修改，无需重启数据库。
     
      表3并行查询系统参数 
     | 参数                      | 说明                                                |
     |:---|:---|
     | force_parallel_execute  | 是否强制启用并行查询。                                       |
     | pq_master_enable        | 主机是否开启并行查询。                                       |
     | parallel_cost_threshold | 启动并行查询的代价阈值，默认值为1000，不建议将该值设置的过小，因为简单查询不适合使用并行查询。 |
        
     也支持会话内修改并行查询并发度，修改启动并行查询的代价阈值，例如将最小执行代价调整为100，可参照如下进行设置：
     ```
     SET parallel_cost_threshold=100;
     ```
     
     
   
- [使用HINT语法开启]
  使用HINT语法可以控制单个语句是否进行并行执行。在系统默认关闭并行执行的情况下, 可以使用hint对特定的SQL进行开启。反之，也可以禁止某条SQL进行并行执行。
  PQ HINT紧跟着SELECT关键字才能生效。PQ HINT的并发度参数parallel_default_dop正常取值范围\[1, min(parallel_max_threads, 1024)\]。parallel_default_dop超出正常取值范围时，PQ不生效。
  - **开启并行执行**
    - 采用默认的参数配置。
      ```
      SELECT /*+ PQ() */ … FROM …
      ```
      
    
    - 采用默认的参数配置，同时指定并发度为8。
      ```
      SELECT /*+ PQ(8) */ … FROM …
      ```
      
    
    - 采用默认的参数配置，同时指定并行表为t1。
      ```
      SELECT /*+ PQ(t1) */ … FROM …
      ```
      
    
    - 采用默认的参数配置，同时指定并行表为t1，并发度为8。
      ```
      SELECT /*+ PQ(t1 8) */ … FROM …
      ```
      
     
  
  - **关闭并行执行**
    当并行查询开启时，可使用"NO_PQ"的HINT语法关闭单条SQL的并行执行。
    NO_PQ HINT的优先级高于PQ HINT，如果SQL语句出现NO_PQ HINT，即使配置PQ HINT，该单条SQL也不会并行执行。
    ```
    SELECT /*+ NO_PQ */ … FROM …
    ```
    
   
#### 查看并行执行的状态
通过如下SQL，查看并行执行的当前状态，显示结果请见[图1]。
```
show status like "%PQ%";
```
图1状态显示   
![](https://support.huaweicloud.com/kerneldesc-taurusdb/figure/zh-cn_image_0000002318229421.png "点击放大")
通过EXPLAIN展示查询语句的并行执行计划，显示结果请见[图2]。
图2并行执行计划结果展示   
![](https://support.huaweicloud.com/kerneldesc-taurusdb/figure/zh-cn_image_0000002283629862.png "点击放大")
![](https://support.huaweicloud.com/kerneldesc-taurusdb/public_sys-resources/note_3.0-zh-cn.png)
与传统的执行计划相比，并行执行计划多了一行记录。在查询结果的第一行，展示了并发度、并行表等信息。
#### 常见问题
#### 通过Hint开启并行查询与控制台上设置参数开启是否存在冲突？
不冲突。通过Hint语法指定的参数仅对当前SQL生效，其优先级高于控制台上设置的并行参数。
