通过 EXPLAIN ANALYZE 获取信息

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

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

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

  • 预计执行成本

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

  • 估计的返回的行数

  • 返回第一行的时间

  • 执行此迭代器(仅包括子迭代器,但不包括父迭代器)所花费的时间,以毫秒为单位。

  • 迭代器返回的行数

  • 循环数

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

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

你可以使用 KILL QUERYCTRL-C 终止此语句。

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

示例

建表

  1. CREATE TABLE t1 (
  2. c1 INTEGER DEFAULT NULL,
  3. c2 INTEGER DEFAULT NULL
  4. );
  5. CREATE TABLE t2 (
  6. c1 INTEGER DEFAULT NULL,
  7. c2 INTEGER DEFAULT NULL
  8. );
  9. CREATE TABLE t3 (
  10. pk INTEGER NOT NULL PRIMARY KEY,
  11. i INTEGER DEFAULT NULL
  12. );

表输出结果

  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)
  23. > EXPLAIN ANALYZE SELECT * FROM t3 WHERE i > 8\G
  24. *************************** 1. row ***************************
  25. QUERY PLAN: Project
  26. *************************** 2. row ***************************
  27. QUERY PLAN: Analyze: timeConsumed=0us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
  28. *************************** 3. row ***************************
  29. QUERY PLAN: -> Table Scan on aaa.t3
  30. *************************** 4. row ***************************
  31. QUERY PLAN: Analyze: timeConsumed=154us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
  32. *************************** 5. row ***************************
  33. QUERY PLAN: Filter Cond: (CAST(t3.i AS BIGINT) > 8)
  34. 5 rows in set (0.00 sec)
  35. > EXPLAIN ANALYZE SELECT * FROM t3 WHERE pk > 17\G
  36. *************************** 1. row ***************************
  37. QUERY PLAN: Project
  38. *************************** 2. row ***************************
  39. QUERY PLAN: Analyze: timeConsumed=0us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
  40. *************************** 3. row ***************************
  41. QUERY PLAN: -> Table Scan on aaa.t3
  42. *************************** 4. row ***************************
  43. QUERY PLAN: Analyze: timeConsumed=309us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
  44. *************************** 5. row ***************************
  45. QUERY PLAN: Filter Cond: (CAST(t3.pk AS BIGINT) > 17)
  46. 5 rows in set (0.00 sec)

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