通过 EXPLAIN ANALYZE 获取信息

EXPLAIN ANALYZE 是一个用于查询的分析工具,它将向你显示 SQL 在查询上花费的时间以及原因。它将计划查询、检测它并执行它,同时计算行数并测量在执行计划的各个点花费的时间。执行完成后,EXPLAIN ANALYZE 将打印计划和测量结果,而不是查询结果。

EXPLAIN ANALYZE,它运行 SQL 语句产生 EXPLAIN 输出,此外,还产生其他信息,例如时间和基于迭代器的附加信息,以及关于优化器的预期与实际执行的匹配情况。

对于每个迭代器,提供以下信息:

  • 预计执行成本

成本模型没有考虑一些迭代器,因此不包括在估算中。

  • 估计的返回的行数
  • 返回第一行的时间
  • 执行此迭代器(仅包括子迭代器,但不包括父迭代器)所花费的时间,以毫秒为单位。
  • 迭代器返回的行数
  • 循环数

查询执行信息使用 TREE 输出格式显示,其中节点代表迭代器。EXPLAIN ANALYZE 始终使用 TREE 输出格式,也可以选择使用 FORMAT=TREE; 显式指定。其他格式 TREE 暂不支持。

EXPLAIN ANALYZE 可以与 SELECT 语句一起使用,也可以与多表 UPDATE 和 DELETE 语句一起使用。

你可以使用 KILL QUERY 或 CTRL-C 终止此语句。

EXPLAIN ANALYZE 不能与 FOR CONNECTION 一起使用。

示例

建表

1. CREATE TABLE t1 (
2. c1 INTEGER DEFAULT NULL,
3. c2 INTEGER DEFAULT NULL
4. );

6. CREATE TABLE t2 (
7. c1 INTEGER DEFAULT NULL,
8. c2 INTEGER DEFAULT NULL
9. );

11. CREATE TABLE t3 (
12. pk INTEGER NOT NULL PRIMARY KEY,
13. i INTEGER DEFAULT NULL
14. );

表输出结果:

1. > EXPLAIN ANALYZE SELECT * FROM t1 JOIN t2 ON (t1.c1 = t2.c2)\G
2. *************************** 1. row ***************************
3. QUERY PLAN: Project
4. *************************** 2. row ***************************
5. QUERY PLAN:   Analyze: timeConsumed=0us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
6. *************************** 3. row ***************************
7. QUERY PLAN:   ->  Join
8. *************************** 4. row ***************************
9. QUERY PLAN:         Analyze: timeConsumed=5053us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
10. *************************** 5. row ***************************
11. QUERY PLAN:         Join Type: INNER
12. *************************** 6. row ***************************
13. QUERY PLAN:         Join Cond: (t1.c1 = t2.c2)
14. *************************** 7. row ***************************
15. QUERY PLAN:         ->  Table Scan on aaa.t1
16. *************************** 8. row ***************************
17. QUERY PLAN:               Analyze: timeConsumed=2176us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
18. *************************** 9. row ***************************
19. QUERY PLAN:         ->  Table Scan on aaa.t2
20. *************************** 10. row ***************************
21. QUERY PLAN:               Analyze: timeConsumed=0us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
22. 10 rows in set (0.00 sec)

24. > EXPLAIN ANALYZE SELECT * FROM t3 WHERE i > 8\G
25. *************************** 1. row ***************************
26. QUERY PLAN: Project
27. *************************** 2. row ***************************
28. QUERY PLAN:   Analyze: timeConsumed=0us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
29. *************************** 3. row ***************************
30. QUERY PLAN:   ->  Table Scan on aaa.t3
31. *************************** 4. row ***************************
32. QUERY PLAN:         Analyze: timeConsumed=154us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
33. *************************** 5. row ***************************
34. QUERY PLAN:         Filter Cond: (CAST(t3.i AS BIGINT) > 8)
35. 5 rows in set (0.00 sec)

37. > EXPLAIN ANALYZE SELECT * FROM t3 WHERE pk > 17\G
38. *************************** 1. row ***************************
39. QUERY PLAN: Project
40. *************************** 2. row ***************************
41. QUERY PLAN:   Analyze: timeConsumed=0us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
42. *************************** 3. row ***************************
43. QUERY PLAN:   ->  Table Scan on aaa.t3
44. *************************** 4. row ***************************
45. QUERY PLAN:         Analyze: timeConsumed=309us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
46. *************************** 5. row ***************************
47. QUERY PLAN:         Filter Cond: (CAST(t3.pk AS BIGINT) > 17)
48. 5 rows in set (0.00 sec)

该语句输出中显示的实际时间值以毫秒为单位。