TiDB 如何知晓查询计划里每个算子预估的代价

mysql> show variables like '%cost_model%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| tidb_cost_model_version | 2     |
+-------------------------+-------+
1 row in set (0.00 sec)

在tidb_cost_model_version = 2的情况下可以查看执行计划cost成本代价计算方式:

mysql> explain analyze format=true_card_cost select * from customer where C_ADDRESS='abc' order by C_PHONE limit 100;
+------------------------------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+-----------+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------+-----------+------+
| id                           | estRows   | estCost     | costFormula                                                                                                                                                                                                                                                                                                                                                                                                                                | actRows | task      | access object  | execution info                                                                                                                                                                                                                       | operator info                              | memory    | disk |
+------------------------------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+-----------+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------+-----------+------+
| TopN_8                       | 1.43      | 3728257.14  | (((((cpu(150000*filters(1)*tikv_cpu_factor(49.9))) + (scan(150000*logrowsize(242.69)*tikv_scan_factor(40.7)))) + ((exprCPU(0*0*tikv_cpu_factor(49.9))) + (orderCPU(0*log(100)*tikv_cpu_factor(49.9)))) + (topMem(100*216*tikv_mem_factor(0.2)))) + (net(0*rowsize(216)*tidb_kv_net_factor(3.96))))/15.00) + ((exprCPU(0*0*tidb_cpu_factor(49.9))) + (orderCPU(0*log(100)*tidb_cpu_factor(49.9)))) + (topMem(100*216*tidb_mem_factor(0.2))) | 0       | root      |                | time:345.2ms, loops:1                                                                                                                                                                                                                | tpch.customer.c_phone, offset:0, count:100 | 0 Bytes   | N/A  |
| └─TableReader_16             | 1.43      | 3723937.14  | ((((cpu(150000*filters(1)*tikv_cpu_factor(49.9))) + (scan(150000*logrowsize(242.69)*tikv_scan_factor(40.7)))) + ((exprCPU(0*0*tikv_cpu_factor(49.9))) + (orderCPU(0*log(100)*tikv_cpu_factor(49.9)))) + (topMem(100*216*tikv_mem_factor(0.2)))) + (net(0*rowsize(216)*tidb_kv_net_factor(3.96))))/15.00                                                                                                                                    | 0       | root      |                | time:345.1ms, loops:2, cop_task: {num: 1, max: 344.8ms, proc_keys: 150000, tot_proc: 343ms, rpc_num: 1, rpc_time: 344.8ms, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15}                                                      | data:TopN_15                               | 277 Bytes | N/A  |
|   └─TopN_15                  | 1.43      | 55859057.06 | ((cpu(150000*filters(1)*tikv_cpu_factor(49.9))) + (scan(150000*logrowsize(242.69)*tikv_scan_factor(40.7)))) + ((exprCPU(0*0*tikv_cpu_factor(49.9))) + (orderCPU(0*log(100)*tikv_cpu_factor(49.9)))) + (topMem(100*216*tikv_mem_factor(0.2)))                                                                                                                                                                                               | 0       | cop[tikv] |                | tikv_task:{time:343ms, loops:147}, scan_detail: {total_process_keys: 150000, total_process_keys_size: 30533765, total_keys: 150001, get_snapshot_time: 87.9µs, rocksdb: {key_skipped_count: 150000, block: {cache_hit_count: 501}}}  | tpch.customer.c_phone, offset:0, count:100 | N/A       | N/A  |
|     └─Selection_14           | 1.43      | 55854737.06 | (cpu(150000*filters(1)*tikv_cpu_factor(49.9))) + (scan(150000*logrowsize(242.69)*tikv_scan_factor(40.7)))                                                                                                                                                                                                                                                                                                                                  | 0       | cop[tikv] |                | tikv_task:{time:343ms, loops:147}                                                                                                                                                                                                    | eq(tpch.customer.c_address, "abc")         | N/A       | N/A  |
|       └─TableFullScan_13     | 211936.00 | 48369737.06 | scan(150000*logrowsize(242.69)*tikv_scan_factor(40.7))                                                                                                                                                                                                                                                                                                                                                                                     | 150000  | cop[tikv] | table:customer | tikv_task:{time:338ms, loops:147}                                                                                                                                                                                                    | keep order:false                           | N/A       | N/A  |
+------------------------------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+-----------+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------+-----------+------+
5 rows in set, 3 warnings (0.37 sec)

总的cost并不是简单的累加,对于存在并行的情况下也会做相应的处理。

2 个赞