通过 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)
该语句输出中显示的实际时间值以毫秒为单位。
