Improve metrics query with measurements join instead of subselect

Change-Id: I2d1a08fb4304b74e7421f2b64bc616ba0de8f4e9
This commit is contained in:
Brad Klein 2016-10-18 12:59:01 -06:00
parent caa50c61fa
commit f31b708f38
2 changed files with 24 additions and 16 deletions

View File

@ -46,11 +46,12 @@ public class MetricDefinitionVerticaRepoImpl implements MetricDefinitionRepo {
"SELECT TO_HEX(defDimsSub.id) "
+ "FROM MonMetrics.Definitions defSub "
+ "JOIN MonMetrics.DefinitionDimensions defDimsSub ON defSub.id = defDimsSub.definition_id "
+ "%s " // possible measurements time join here
+ "WHERE defSub.tenant_id = :tenantId "
+ "%s " // Name goes here
+ "%s " // Offset goes here
+ "%s " // Dimensions and clause goes here
+ "%s " // Time qualifier goes here
+ "%s " // possible time and clause here
+ "GROUP BY defDimsSub.id "
+ "ORDER BY defDimsSub.id ASC "
+ "%s "; // limit goes here
@ -227,12 +228,12 @@ public class MetricDefinitionVerticaRepoImpl implements MetricDefinitionRepo {
String.format(MetricQueries.FIND_METRIC_DEFS_SQL,
this.dbHint,
String.format(METRIC_DEF_SUB_QUERY,
MetricQueries.buildTimeJoin(startTime),
namePart,
offsetPart,
MetricQueries.buildDimensionAndClause(dimensions,
TABLE_TO_JOIN_ON),
MetricQueries.buildTimeAndClause(startTime, endTime,
TABLE_TO_JOIN_ON),
MetricQueries.buildTimeAndClause(startTime, endTime),
limitPart)
);

View File

@ -52,15 +52,18 @@ final class MetricQueries {
"SELECT TO_HEX(defDimsSub.id) as id "
+ "FROM MonMetrics.Definitions as defSub "
+ "JOIN MonMetrics.DefinitionDimensions as defDimsSub ON defDimsSub.definition_id = defSub.id "
+ "%s " // possible measurements time join here
+ "WHERE defSub.tenant_id = :tenantId "
+ "%s " // metric name here
+ "%s " // dimension and clause here
+ "%s " // time and clause here
+ "%s " // possible time and clause here
+ "GROUP BY defDimsSub.id";
private static final String MEASUREMENT_AND_CLAUSE =
"SELECT definition_dimensions_id FROM MonMetrics.Measurements "
+ "WHERE time_stamp >= :startTime "; // start or start and end time here
"AND time_stamp >= :startTime "; // start or start and end time here
private static final String MEASUREMENT_JOIN =
"JOIN MonMetrics.Measurements AS meas ON defDimsSub.id = meas.definition_dimensions_id";
private static final String TABLE_TO_JOIN_ON = "defDimsSub";
@ -76,11 +79,10 @@ final class MetricQueries {
}
return String.format(METRIC_DEF_SUB_SQL,
buildTimeJoin(startTime),
namePart,
buildDimensionAndClause(dimensions,
TABLE_TO_JOIN_ON),
buildTimeAndClause(startTime, endTime,
TABLE_TO_JOIN_ON));
buildDimensionAndClause(dimensions, TABLE_TO_JOIN_ON),
buildTimeAndClause(startTime, endTime));
}
static String buildDimensionAndClause(Map<String, String> dimensions,
@ -139,8 +141,7 @@ final class MetricQueries {
static String buildTimeAndClause(
DateTime startTime,
DateTime endTime,
String tableToJoin)
DateTime endTime)
{
if (startTime == null) {
return "";
@ -148,19 +149,24 @@ final class MetricQueries {
StringBuilder timeAndClause = new StringBuilder();
timeAndClause.append("AND ").append(tableToJoin).append(".id IN (");
timeAndClause.append(MEASUREMENT_AND_CLAUSE);
if (endTime != null) {
timeAndClause.append("AND time_stamp <= :endTime ");
}
timeAndClause.append(")");
return timeAndClause.toString();
}
static String buildTimeJoin(DateTime startTime)
{
if (startTime == null) {
return "";
}
return MEASUREMENT_JOIN;
}
static void bindDimensionsToQuery(Query<?> query, Map<String, String> dimensions) {
if (dimensions != null) {
int i = 0;
@ -203,6 +209,7 @@ final class MetricQueries {
}
String sql = String.format(METRIC_DEF_SUB_SQL,
"",
namePart,
buildDimensionAndClause(dimensions,
TABLE_TO_JOIN_ON),