diff options
author | Alex Tatiyants <atatiyan@gmail.com> | 2016-03-05 11:58:52 -0800 |
---|---|---|
committer | Alex Tatiyants <atatiyan@gmail.com> | 2016-03-05 11:58:52 -0800 |
commit | cd2af1466b1c23f81c13af61fa550475f82e0227 (patch) | |
tree | 30c17082928a60c4822b0499ac4ca9b5e1731b3a | |
parent | 7fc812bc761c95e508e1c540393b12b03cdf1d03 (diff) |
better handle CTE scans, including correct duration calculations. fix #15
-rw-r--r-- | app/components/plan-node/plan-node.html | 3 | ||||
-rw-r--r-- | app/services/help-service.ts | 5 | ||||
-rw-r--r-- | app/services/plan-service.ts | 13 |
3 files changed, 18 insertions, 3 deletions
diff --git a/app/components/plan-node/plan-node.html b/app/components/plan-node/plan-node.html index 60cdf50..86db018 100644 --- a/app/components/plan-node/plan-node.html +++ b/app/components/plan-node/plan-node.html @@ -35,6 +35,9 @@ using</span> {{node[_planService.INDEX_NAME_PROP]}}</div> <div class="relation-name" *ngIf="node[_planService.HASH_CONDITION_PROP]"><span class="text-muted"> on</span> {{node[_planService.HASH_CONDITION_PROP]}}</div> + <div class="relation-name" *ngIf="node[_planService.CTE_NAME_PROP]"> + <span class="text-muted">CTE</span> {{node[_planService.CTE_NAME_PROP]}} + </div> </div> <div class="tags" *ngIf="viewOptions.showTags && tags.length > 0"> diff --git a/app/services/help-service.ts b/app/services/help-service.ts index 6067b05..532d694 100644 --- a/app/services/help-service.ts +++ b/app/services/help-service.ts @@ -26,5 +26,8 @@ export var NODE_DESCRIPTIONS = { from the index and do not read from the corresponding table.`, 'BITMAP HEAP SCAN': 'searches through the pages returned by the <strong>Bitmap Index Scan</strong> for relevant rows.', 'BITMAP INDEX SCAN': `uses a <strong>Bitmap Index</strong> (index which uses 1 bit per page) to find all relevant pages. - Results of this node are fed to the <strong>Bitmap Heap Scan</strong>.` + Results of this node are fed to the <strong>Bitmap Heap Scan</strong>.`, + 'CTE SCAN': `performs a sequential scan of <strong>Common Table Expression (CTE) query</strong> results. Note that + results of a CTE are materialized (calculated and temporarily stored).` + }; diff --git a/app/services/plan-service.ts b/app/services/plan-service.ts index e634f64..c34a52a 100644 --- a/app/services/plan-service.ts +++ b/app/services/plan-service.ts @@ -36,6 +36,9 @@ export class PlanService { PLANNER_ESTIMATE_FACTOR: string = '*Planner Row Estimate Factor'; PLANNER_ESIMATE_DIRECTION: string = '*Planner Row Estimate Direction'; + CTE_SCAN_PROP = 'CTE Scan'; + CTE_NAME_PROP = 'CTE Name'; + ARRAY_INDEX_KEY: string = 'arrayIndex'; PEV_PLAN_TAG: string = 'plan_'; @@ -159,9 +162,15 @@ export class PlanService { node[this.ACTUAL_DURATION_PROP] = node[this.ACTUAL_TOTAL_TIME_PROP]; node[this.ACTUAL_COST_PROP] = node[this.TOTAL_COST_PROP]; + console.log (node); _.each(node.Plans, subPlan => { - node[this.ACTUAL_DURATION_PROP] = node[this.ACTUAL_DURATION_PROP] - subPlan[this.ACTUAL_TOTAL_TIME_PROP]; - node[this.ACTUAL_COST_PROP] = node[this.ACTUAL_COST_PROP] - subPlan[this.TOTAL_COST_PROP]; + console.log('processing chldren', subPlan) + // since CTE scan duration is already included in its subnodes, it should be be + // subtracted from the duration of this node + if (subPlan[this.NODE_TYPE_PROP] !== this.CTE_SCAN_PROP) { + node[this.ACTUAL_DURATION_PROP] = node[this.ACTUAL_DURATION_PROP] - subPlan[this.ACTUAL_TOTAL_TIME_PROP]; + node[this.ACTUAL_COST_PROP] = node[this.ACTUAL_COST_PROP] - subPlan[this.TOTAL_COST_PROP]; + } }); if (node[this.ACTUAL_COST_PROP] < 0) { |