Using one of the standard teaching examples, compare the outputs:
regression=> EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2; QUERY PLAN ------------------------------------------------------------------------------------------ Hash Join (cost=227.95..700.46 rows=101 width=488) Hash Cond: (t2.unique2 = t1.unique2) -> Seq Scan on tenk2 t2 (cost=0.00..434.00 rows=10000 width=244) -> Hash (cost=226.68..226.68 rows=101 width=244) -> Bitmap Heap Scan on tenk1 t1 (cost=5.03..226.68 rows=101 width=244) Recheck Cond: (unique1 < 100) -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.01 rows=101 width=0) Index Cond: (unique1 < 100) (8 rows)
regression=> EXPLAIN (FORMAT JSON) SELECT * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2; QUERY PLAN ----------------------------------------------------- [ + { + "Plan": { + "Node Type": "Hash Join", + "Join Type": "Inner", + "Startup Cost": 227.95, + "Total Cost": 700.46, + "Plan Rows": 101, + "Plan Width": 488, + "Hash Cond": "(t2.unique2 = t1.unique2)", + "Plans": [ + { + "Node Type": "Seq Scan", + "Parent Relationship": "Outer", + "Relation Name": "tenk2", + "Alias": "t2", + "Startup Cost": 0.00, + "Total Cost": 434.00, + "Plan Rows": 10000, + "Plan Width": 244 + }, + { + "Node Type": "Hash", + "Parent Relationship": "Inner", + "Startup Cost": 226.68, + "Total Cost": 226.68, + "Plan Rows": 101, + "Plan Width": 244, + "Plans": [ + { + "Node Type": "Bitmap Heap Scan", + "Parent Relationship": "Outer", + "Relation Name": "tenk1", + "Alias": "t1", + "Startup Cost": 5.03, + "Total Cost": 226.68, + "Plan Rows": 101, + "Plan Width": 244, + "Recheck Cond": "(unique1 < 100)", + "Plans": [ + { + "Node Type": "Bitmap Index Scan",+ "Parent Relationship": "Outer", + "Index Name": "tenk1_unique1", + "Startup Cost": 0.00, + "Total Cost": 5.01, + "Plan Rows": 101, + "Plan Width": 0, + "Index Cond": "(unique1 < 100)" + } + ] + } + ] + } + ] + } + } + ] (1 row)For just reading the plan, the new formats are probably not better, although some might prefer them. The real win comes when you can feed this to a program to create a visualization. With the old format, parsing the output was complicated and error prone. With the new formats, it is easy. In fact, it was so easy that I couldn't resist writing a small visual explain program that renders plans through the graphviz library. Here is how you can use it:
regression=> \a\t regression=> EXPLAIN (FORMAT JSON) SELECT * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2 \g |veungResult:
Simple and useful. Get it from GitHub.
Hey, that's pretty spiffy.
ReplyDeleteI'd love to try it out, but I wasn't able to find the libraries it needs on OSX 10.6/Fink or Fedora 12. Where might I find them?
ReplyDeletepygraphviz is at http://networkx.lanl.gov/pygraphviz/, simplejson is at http://undefined.org/python/#simplejson; the other modules are in the standard library.
ReplyDelete