From 065f56e1619510f8f982912fc91c4b127f6ebbfb Mon Sep 17 00:00:00 2001 From: Rafa de la Torre Date: Wed, 7 Feb 2018 18:10:13 +0100 Subject: [PATCH 1/3] Improve the speed of the aggregation dataview Improve the performance of the aggregation dataview. Instead of using a CTE (WITH) for filtered_source, which is only used in one place to calculate ranks, inject it as a subquery. This way the planner has a chance to ignore uneeded columns as well as to parallelize the exectution of the window function (WindowAgg in the query plan). That is the part that takes most of the time of the query. The improvement is about 20-40% in speed on PG10 with 4 cores. --- lib/cartodb/models/dataview/aggregation.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/cartodb/models/dataview/aggregation.js b/lib/cartodb/models/dataview/aggregation.js index fed5e14e..0b0cc4c7 100644 --- a/lib/cartodb/models/dataview/aggregation.js +++ b/lib/cartodb/models/dataview/aggregation.js @@ -2,7 +2,7 @@ const BaseDataview = require('./base'); const debug = require('debug')('windshaft:dataview:aggregation'); const filteredQueryTpl = ctx => ` - filtered_source AS ( + ( SELECT * FROM (${ctx.query}) _cdb_filtered_source ${ctx.aggregationColumn && ctx.isFloatColumn ? ` @@ -14,7 +14,7 @@ const filteredQueryTpl = ctx => ` ${ctx.aggregationColumn} != 'NaN'::float` : '' } - ) + ) filtered_source `; const summaryQueryTpl = ctx => ` @@ -43,7 +43,7 @@ const rankedCategoriesQueryTpl = ctx => ` ${ctx.column} AS category, ${ctx.aggregationFn} AS value, row_number() OVER (ORDER BY ${ctx.aggregationFn} desc) as rank - FROM filtered_source + FROM ${filteredQueryTpl(ctx)} ${ctx.aggregationColumn !== null ? `WHERE ${ctx.aggregationColumn} IS NOT NULL` : ''} GROUP BY ${ctx.column} ORDER BY 2 DESC @@ -134,7 +134,6 @@ const aggregationFnQueryTpl = ctx => `${ctx.aggregation}(${ctx.aggregationColumn const aggregationDataviewQueryTpl = ctx => ` WITH - ${filteredQueryTpl(ctx)}, ${summaryQueryTpl(ctx)}, ${rankedCategoriesQueryTpl(ctx)}, ${categoriesSummaryMinMaxQueryTpl(ctx)}, From 251fe9650927a3bb1fd1553b3729996712244707 Mon Sep 17 00:00:00 2001 From: Rafa de la Torre Date: Mon, 12 Feb 2018 19:24:53 +0100 Subject: [PATCH 2/3] Cosmetic fix, as suggested in PR --- lib/cartodb/models/dataview/aggregation.js | 26 ++++++++++------------ 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/lib/cartodb/models/dataview/aggregation.js b/lib/cartodb/models/dataview/aggregation.js index 0b0cc4c7..568d3cc2 100644 --- a/lib/cartodb/models/dataview/aggregation.js +++ b/lib/cartodb/models/dataview/aggregation.js @@ -2,19 +2,17 @@ const BaseDataview = require('./base'); const debug = require('debug')('windshaft:dataview:aggregation'); const filteredQueryTpl = ctx => ` - ( - SELECT * - FROM (${ctx.query}) _cdb_filtered_source - ${ctx.aggregationColumn && ctx.isFloatColumn ? ` - WHERE - ${ctx.aggregationColumn} != 'infinity'::float - AND - ${ctx.aggregationColumn} != '-infinity'::float - AND - ${ctx.aggregationColumn} != 'NaN'::float` : - '' - } - ) filtered_source + SELECT * + FROM (${ctx.query}) _cdb_filtered_source + ${ctx.aggregationColumn && ctx.isFloatColumn ? ` + WHERE + ${ctx.aggregationColumn} != 'infinity'::float + AND + ${ctx.aggregationColumn} != '-infinity'::float + AND + ${ctx.aggregationColumn} != 'NaN'::float` : + '' + } `; const summaryQueryTpl = ctx => ` @@ -43,7 +41,7 @@ const rankedCategoriesQueryTpl = ctx => ` ${ctx.column} AS category, ${ctx.aggregationFn} AS value, row_number() OVER (ORDER BY ${ctx.aggregationFn} desc) as rank - FROM ${filteredQueryTpl(ctx)} + FROM (${filteredQueryTpl(ctx)}) filtered_source ${ctx.aggregationColumn !== null ? `WHERE ${ctx.aggregationColumn} IS NOT NULL` : ''} GROUP BY ${ctx.column} ORDER BY 2 DESC From b4e06ec1acfa68bd10fdcad78dc01b497a7fc8b3 Mon Sep 17 00:00:00 2001 From: Rafa de la Torre Date: Mon, 12 Feb 2018 19:35:34 +0100 Subject: [PATCH 3/3] Update NEWS.md and stub version --- NEWS.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index e03a601f..d4a88f33 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,9 @@ # Changelog +## 5.3.1 +Released yyyy-mm-dd + - Improve the speed of the aggregation dataview #865 + ## 5.3.0 Released 2018-02-12 - Upgrades redis-mpool to 0.5.0 diff --git a/package.json b/package.json index 8e3d6917..b9540a97 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "windshaft-cartodb", - "version": "5.3.0", + "version": "5.3.1", "description": "A map tile server for CartoDB", "keywords": [ "cartodb"