|
7 | 7 | * Portions Copyright (c) 1994-5, Regents of the University of California
|
8 | 8 | *
|
9 | 9 | * IDENTIFICATION
|
10 |
| - * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.200 2010/02/01 15:43:35 rhaas Exp $ |
| 10 | + * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.201 2010/02/15 02:36:26 stark Exp $ |
11 | 11 | *
|
12 | 12 | *-------------------------------------------------------------------------
|
13 | 13 | */
|
@@ -98,6 +98,7 @@ static void ExplainJSONLineEnding(ExplainState *es);
|
98 | 98 | staticvoidExplainYAMLLineStarting(ExplainState*es);
|
99 | 99 | staticvoidescape_json(StringInfobuf,constchar*str);
|
100 | 100 | staticvoidescape_yaml(StringInfobuf,constchar*str);
|
| 101 | +staticdoublenormalize_memory(doubleamount,char**unit,int*precision); |
101 | 102 |
|
102 | 103 |
|
103 | 104 | /*
|
@@ -1081,47 +1082,63 @@ ExplainNode(Plan *plan, PlanState *planstate,
|
1081 | 1082 | if (has_shared||has_local||has_temp)
|
1082 | 1083 | {
|
1083 | 1084 | appendStringInfoSpaces(es->str,es->indent*2);
|
1084 |
| -appendStringInfoString(es->str,"Buffers:"); |
| 1085 | +appendStringInfoString(es->str,"Total Buffer Usage:"); |
1085 | 1086 |
|
1086 | 1087 | if (has_shared)
|
1087 | 1088 | {
|
| 1089 | +char*hit_unit,*read_unit,*written_unit; |
| 1090 | +inthit_prec,read_prec,written_prec; |
| 1091 | +doublehit_mem=normalize_memory((double)usage->shared_blks_hit*BLCKSZ,&hit_unit,&hit_prec); |
| 1092 | +doubleread_mem=normalize_memory((double)usage->shared_blks_read*BLCKSZ,&read_unit,&read_prec); |
| 1093 | +doublewritten_mem=normalize_memory((double)usage->shared_blks_written*BLCKSZ,&written_unit,&written_prec); |
| 1094 | + |
1088 | 1095 | appendStringInfoString(es->str," shared");
|
1089 |
| -if (usage->shared_blks_hit>0) |
1090 |
| -appendStringInfo(es->str," hit=%ld", |
1091 |
| -usage->shared_blks_hit); |
| 1096 | +appendStringInfo(es->str," hit=%.*f%s", |
| 1097 | +hit_prec,hit_mem,hit_unit); |
1092 | 1098 | if (usage->shared_blks_read>0)
|
1093 |
| -appendStringInfo(es->str," read=%ld", |
1094 |
| -usage->shared_blks_read); |
| 1099 | +appendStringInfo(es->str," read=%.*f%s", |
| 1100 | +read_prec,read_mem,read_unit); |
1095 | 1101 | if (usage->shared_blks_written>0)
|
1096 |
| -appendStringInfo(es->str," written=%ld", |
1097 |
| -usage->shared_blks_written); |
| 1102 | +appendStringInfo(es->str," written=%.*f%s", |
| 1103 | +written_prec,written_mem,written_unit); |
1098 | 1104 | if (has_local||has_temp)
|
1099 | 1105 | appendStringInfoChar(es->str,',');
|
1100 | 1106 | }
|
1101 | 1107 | if (has_local)
|
1102 | 1108 | {
|
1103 |
| -appendStringInfoString(es->str," local"); |
1104 |
| -if (usage->local_blks_hit>0) |
1105 |
| -appendStringInfo(es->str," hit=%ld", |
1106 |
| -usage->local_blks_hit); |
1107 |
| -if (usage->local_blks_read>0) |
1108 |
| -appendStringInfo(es->str," read=%ld", |
1109 |
| -usage->local_blks_read); |
1110 |
| -if (usage->local_blks_written>0) |
1111 |
| -appendStringInfo(es->str," written=%ld", |
1112 |
| -usage->local_blks_written); |
| 1109 | +char*hit_unit,*read_unit,*written_unit; |
| 1110 | +inthit_prec,read_prec,written_prec; |
| 1111 | +doublehit_mem=normalize_memory((double)usage->local_blks_hit*BLCKSZ,&hit_unit,&hit_prec); |
| 1112 | +doubleread_mem=normalize_memory((double)usage->local_blks_read*BLCKSZ,&read_unit,&read_prec); |
| 1113 | +doublewritten_mem=normalize_memory((double)usage->local_blks_written*BLCKSZ,&written_unit,&written_prec); |
| 1114 | + |
| 1115 | +appendStringInfoString(es->str," local"); |
| 1116 | +if (usage->local_blks_hit>0) |
| 1117 | +appendStringInfo(es->str," hit=%.*f%s", |
| 1118 | +hit_prec,hit_mem,hit_unit); |
| 1119 | +if (usage->local_blks_read>0) |
| 1120 | +appendStringInfo(es->str," read=%.*f%s", |
| 1121 | +read_prec,read_mem,read_unit); |
| 1122 | +if (usage->local_blks_written>0) |
| 1123 | +appendStringInfo(es->str," written=%.*f%s", |
| 1124 | +written_prec,written_mem,written_unit); |
1113 | 1125 | if (has_temp)
|
1114 | 1126 | appendStringInfoChar(es->str,',');
|
1115 | 1127 | }
|
1116 | 1128 | if (has_temp)
|
1117 | 1129 | {
|
| 1130 | +char*read_unit,*written_unit; |
| 1131 | +intread_prec,written_prec; |
| 1132 | +doubleread_mem=normalize_memory((double)usage->temp_blks_read*BLCKSZ,&read_unit,&read_prec); |
| 1133 | +doublewritten_mem=normalize_memory((double)usage->temp_blks_written*BLCKSZ,&written_unit,&written_prec); |
| 1134 | + |
1118 | 1135 | appendStringInfoString(es->str," temp");
|
1119 | 1136 | if (usage->temp_blks_read>0)
|
1120 |
| -appendStringInfo(es->str," read=%ld", |
1121 |
| -usage->temp_blks_read); |
1122 |
| -if (usage->temp_blks_written>0) |
1123 |
| -appendStringInfo(es->str," written=%ld", |
1124 |
| -usage->temp_blks_written); |
| 1137 | +appendStringInfo(es->str," read=%.*f%s", |
| 1138 | +read_prec,read_mem,read_unit); |
| 1139 | +if (usage->temp_blks_written>0) |
| 1140 | +appendStringInfo(es->str," written=%.*f%s", |
| 1141 | +written_prec,written_mem,written_unit); |
1125 | 1142 | }
|
1126 | 1143 | appendStringInfoChar(es->str,'\n');
|
1127 | 1144 | }
|
@@ -2153,3 +2170,36 @@ escape_yaml(StringInfo buf, const char *str)
|
2153 | 2170 |
|
2154 | 2171 | appendStringInfo(buf,"%s",str);
|
2155 | 2172 | }
|
| 2173 | + |
| 2174 | +/* |
| 2175 | + * For a quantity of bytes pick a reasonable display unit for it and |
| 2176 | + * return the quantity in that unit. Also return the unit name and a |
| 2177 | + * reasonable precision via the reference parameters. |
| 2178 | + */ |
| 2179 | + |
| 2180 | +staticdoublenormalize_memory(doubleamount,char**unit,int*precision) |
| 2181 | +{ |
| 2182 | +staticchar*units[]= {"bytes","kB","MB","GB","TB","PB"}; |
| 2183 | +char**u=units,**last=units+ (sizeof(units)/sizeof(*units)-1); |
| 2184 | + |
| 2185 | +while (amount>1024.0&&u<last) |
| 2186 | +{ |
| 2187 | +amount /=1024.0; |
| 2188 | +u+=1; |
| 2189 | +} |
| 2190 | + |
| 2191 | +*unit=*u; |
| 2192 | + |
| 2193 | +/* if it's bytes or kB then don't print decimals since that's less |
| 2194 | + * than blocksize, otherwise always print 3 significant digits */ |
| 2195 | +if (u==units||u==units+1 ) |
| 2196 | +*precision=0; |
| 2197 | +elseif (amount<10) |
| 2198 | +*precision=2; |
| 2199 | +elseif (amount<100) |
| 2200 | +*precision=1; |
| 2201 | +else |
| 2202 | +*precision=0; |
| 2203 | + |
| 2204 | +returnamount; |
| 2205 | +} |