Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support persistent CTE's #20887

Merged
merged 3 commits into from Dec 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view

Large diffs are not rendered by default.

Expand Up @@ -29,6 +29,7 @@
import com.facebook.presto.sql.analyzer.FeaturesConfig;
import com.facebook.presto.sql.analyzer.FeaturesConfig.AggregationIfToFilterRewriteStrategy;
import com.facebook.presto.sql.analyzer.FeaturesConfig.AggregationPartitioningMergingStrategy;
import com.facebook.presto.sql.analyzer.FeaturesConfig.CteMaterializationStrategy;
import com.facebook.presto.sql.analyzer.FeaturesConfig.JoinDistributionType;
import com.facebook.presto.sql.analyzer.FeaturesConfig.JoinNotNullInferenceStrategy;
import com.facebook.presto.sql.analyzer.FeaturesConfig.JoinReorderingStrategy;
Expand Down Expand Up @@ -186,6 +187,7 @@ public final class SystemSessionProperties
public static final String MAX_DRIVERS_PER_TASK = "max_drivers_per_task";
public static final String MAX_TASKS_PER_STAGE = "max_tasks_per_stage";
public static final String DEFAULT_FILTER_FACTOR_ENABLED = "default_filter_factor_enabled";
public static final String CTE_MATERIALIZATION_STRATEGY = "cte_materialization_strategy";
public static final String DEFAULT_JOIN_SELECTIVITY_COEFFICIENT = "default_join_selectivity_coefficient";
public static final String PUSH_LIMIT_THROUGH_OUTER_JOIN = "push_limit_through_outer_join";
public static final String OPTIMIZE_CONSTANT_GROUPING_KEYS = "optimize_constant_grouping_keys";
Expand Down Expand Up @@ -1038,6 +1040,18 @@ public SystemSessionProperties(
"use a default filter factor for unknown filters in a filter node",
featuresConfig.isDefaultFilterFactorEnabled(),
false),
new PropertyMetadata<>(
CTE_MATERIALIZATION_STRATEGY,
format("The strategy to materialize common table expressions. Options are %s",
Stream.of(CteMaterializationStrategy.values())
.map(CteMaterializationStrategy::name)
.collect(joining(","))),
VARCHAR,
CteMaterializationStrategy.class,
featuresConfig.getCteMaterializationStrategy(),
false,
value -> CteMaterializationStrategy.valueOf(((String) value).toUpperCase()),
CteMaterializationStrategy::name),
new PropertyMetadata<>(
DEFAULT_JOIN_SELECTIVITY_COEFFICIENT,
"use a default join selectivity coefficient factor when column statistics are not available in a join node",
Expand Down Expand Up @@ -2310,6 +2324,11 @@ public static DataSize getFilterAndProjectMinOutputPageSize(Session session)
return session.getSystemProperty(FILTER_AND_PROJECT_MIN_OUTPUT_PAGE_SIZE, DataSize.class);
}

public static CteMaterializationStrategy getCteMaterializationStrategy(Session session)
{
return session.getSystemProperty(CTE_MATERIALIZATION_STRATEGY, CteMaterializationStrategy.class);
}

public static int getFilterAndProjectMinOutputPageRowCount(Session session)
{
return session.getSystemProperty(FILTER_AND_PROJECT_MIN_OUTPUT_PAGE_ROW_COUNT, Integer.class);
Expand Down

Large diffs are not rendered by default.

Expand Up @@ -23,14 +23,19 @@ public class CTEInformationCollector
{
private final HashMap<String, CTEInformation> cteInformationMap = new HashMap<>();

public void addCTEReference(String cteName, boolean isView)
public void addCTEReference(String cteName, boolean isView, boolean isMaterialized)
{
cteInformationMap.putIfAbsent(cteName, new CTEInformation(cteName, 0, isView));
cteInformationMap.putIfAbsent(cteName, new CTEInformation(cteName, 0, isView, isMaterialized));
cteInformationMap.get(cteName).incrementReferences();
}

public List<CTEInformation> getCTEInformationList()
{
return ImmutableList.copyOf(cteInformationMap.values());
}

public HashMap<String, CTEInformation> getCteInformationMap()
{
return cteInformationMap;
}
}
Expand Up @@ -90,6 +90,8 @@ public class FeaturesConfig
private DataSize maxRevocableMemoryPerTask = new DataSize(500, MEGABYTE);
private JoinReorderingStrategy joinReorderingStrategy = JoinReorderingStrategy.AUTOMATIC;
private PartialMergePushdownStrategy partialMergePushdownStrategy = PartialMergePushdownStrategy.NONE;

private CteMaterializationStrategy cteMaterializationStrategy = CteMaterializationStrategy.NONE;
private int maxReorderedJoins = 9;
private boolean useHistoryBasedPlanStatistics;
private boolean trackHistoryBasedPlanStatistics;
Expand Down Expand Up @@ -348,6 +350,12 @@ public boolean isAdoptingMergedPreference()
}
}

public enum CteMaterializationStrategy
{
ALL, // Materialize all CTES
NONE // Materialize no ctes
}

public enum TaskSpillingStrategy
{
ORDER_BY_CREATE_TIME, // When spilling is triggered, revoke tasks in order of oldest to newest
Expand Down Expand Up @@ -565,6 +573,19 @@ public FeaturesConfig setLegacyMapSubscript(boolean value)
return this;
}

public CteMaterializationStrategy getCteMaterializationStrategy()
{
return cteMaterializationStrategy;
}

@Config("cte-materialization-strategy")
@ConfigDescription("Set strategy used to determine whether to materialize CTEs (ALL, NONE)")
public FeaturesConfig setCteMaterializationStrategy(CteMaterializationStrategy cteMaterializationStrategy)
{
this.cteMaterializationStrategy = cteMaterializationStrategy;
return this;
}

public boolean isLegacyMapSubscript()
{
return legacyMapSubscript;
Expand Down