use of io.trino.server.DynamicFilterService.DynamicFilterDomainStats in project trino by trinodb.
the class PlanPrinter method textDistributedPlan.
public static String textDistributedPlan(StageInfo outputStageInfo, QueryStats queryStats, ValuePrinter valuePrinter, boolean verbose) {
Map<PlanNodeId, TableInfo> tableInfos = getAllStages(Optional.of(outputStageInfo)).stream().map(StageInfo::getTables).map(Map::entrySet).flatMap(Collection::stream).collect(toImmutableMap(Entry::getKey, Entry::getValue));
StringBuilder builder = new StringBuilder();
List<StageInfo> allStages = getAllStages(Optional.of(outputStageInfo));
List<PlanFragment> allFragments = allStages.stream().map(StageInfo::getPlan).collect(toImmutableList());
Map<PlanNodeId, PlanNodeStats> aggregatedStats = aggregateStageStats(allStages);
Map<DynamicFilterId, DynamicFilterDomainStats> dynamicFilterDomainStats = queryStats.getDynamicFiltersStats().getDynamicFilterDomainStats().stream().collect(toImmutableMap(DynamicFilterDomainStats::getDynamicFilterId, identity()));
TypeProvider typeProvider = getTypeProvider(allFragments);
for (StageInfo stageInfo : allStages) {
builder.append(formatFragment(tableScanNode -> tableInfos.get(tableScanNode.getId()), dynamicFilterDomainStats, valuePrinter, stageInfo.getPlan(), Optional.of(stageInfo), Optional.of(aggregatedStats), verbose, typeProvider));
}
return builder.toString();
}
use of io.trino.server.DynamicFilterService.DynamicFilterDomainStats in project trino by trinodb.
the class TestDynamicFilterService method testMultipleAttempts.
@Test
public void testMultipleAttempts() {
DynamicFilterService dynamicFilterService = createDynamicFilterService();
DynamicFilterId filterId = new DynamicFilterId("df");
QueryId queryId = new QueryId("query");
StageId stageId = new StageId(queryId, 0);
dynamicFilterService.registerQuery(queryId, session, ImmutableSet.of(filterId), ImmutableSet.of(filterId), ImmutableSet.of());
dynamicFilterService.stageCannotScheduleMoreTasks(stageId, 0, 3);
assertFalse(dynamicFilterService.getSummary(queryId, filterId).isPresent());
// Collect DF from 2 tasks
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId, 0, 0), ImmutableMap.of(filterId, singleValue(INTEGER, 1L)));
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId, 1, 0), ImmutableMap.of(filterId, singleValue(INTEGER, 2L)));
assertFalse(dynamicFilterService.getSummary(queryId, filterId).isPresent());
// Register query retry
dynamicFilterService.registerQueryRetry(queryId, 1);
dynamicFilterService.stageCannotScheduleMoreTasks(stageId, 1, 3);
// Ignore update from previous attempt
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId, 2, 0), ImmutableMap.of(filterId, singleValue(INTEGER, 3L)));
assertFalse(dynamicFilterService.getSummary(queryId, filterId).isPresent());
// Collect DF from 3 tasks in new attempt
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId, 0, 1), ImmutableMap.of(filterId, singleValue(INTEGER, 4L)));
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId, 1, 1), ImmutableMap.of(filterId, singleValue(INTEGER, 5L)));
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId, 2, 1), ImmutableMap.of(filterId, singleValue(INTEGER, 6L)));
assertEquals(dynamicFilterService.getSummary(queryId, filterId), Optional.of(multipleValues(INTEGER, ImmutableList.of(4L, 5L, 6L))));
DynamicFiltersStats stats = dynamicFilterService.getDynamicFilteringStats(queryId, session);
assertEquals(stats.getDynamicFiltersCompleted(), 1);
assertEquals(stats.getLazyDynamicFilters(), 1);
assertEquals(stats.getReplicatedDynamicFilters(), 0);
assertEquals(stats.getDynamicFilterDomainStats(), ImmutableList.of(new DynamicFilterDomainStats(filterId, getSimplifiedDomainString(4L, 6L, 3, INTEGER))));
}
use of io.trino.server.DynamicFilterService.DynamicFilterDomainStats in project trino by trinodb.
the class TestDynamicFilterService method testDynamicFilter.
@Test
public void testDynamicFilter() {
DynamicFilterService dynamicFilterService = createDynamicFilterService();
DynamicFilterId filterId1 = new DynamicFilterId("df1");
DynamicFilterId filterId2 = new DynamicFilterId("df2");
DynamicFilterId filterId3 = new DynamicFilterId("df3");
SymbolAllocator symbolAllocator = new SymbolAllocator();
Symbol symbol1 = symbolAllocator.newSymbol("DF_SYMBOL1", INTEGER);
Symbol symbol2 = symbolAllocator.newSymbol("DF_SYMBOL2", INTEGER);
Symbol symbol3 = symbolAllocator.newSymbol("DF_SYMBOL3", INTEGER);
Expression df1 = symbol1.toSymbolReference();
Expression df2 = symbol2.toSymbolReference();
Expression df3 = symbol3.toSymbolReference();
QueryId queryId = new QueryId("query");
StageId stageId1 = new StageId(queryId, 1);
StageId stageId2 = new StageId(queryId, 2);
StageId stageId3 = new StageId(queryId, 3);
dynamicFilterService.registerQuery(queryId, session, ImmutableSet.of(filterId1, filterId2, filterId3), ImmutableSet.of(filterId1, filterId2, filterId3), ImmutableSet.of());
dynamicFilterService.stageCannotScheduleMoreTasks(stageId1, 0, 2);
dynamicFilterService.stageCannotScheduleMoreTasks(stageId2, 0, 2);
dynamicFilterService.stageCannotScheduleMoreTasks(stageId3, 0, 2);
DynamicFilter dynamicFilter = dynamicFilterService.createDynamicFilter(queryId, ImmutableList.of(new DynamicFilters.Descriptor(filterId1, df1), new DynamicFilters.Descriptor(filterId2, df2), new DynamicFilters.Descriptor(filterId3, df3)), ImmutableMap.of(symbol1, new TestingColumnHandle("probeColumnA"), symbol2, new TestingColumnHandle("probeColumnA"), symbol3, new TestingColumnHandle("probeColumnB")), symbolAllocator.getTypes());
assertEquals(dynamicFilter.getColumnsCovered(), Set.of(new TestingColumnHandle("probeColumnA"), new TestingColumnHandle("probeColumnB")), "columns covered");
assertTrue(dynamicFilter.getCurrentPredicate().isAll());
assertFalse(dynamicFilter.isComplete());
assertTrue(dynamicFilter.isAwaitable());
// assert initial dynamic filtering stats
DynamicFiltersStats stats = dynamicFilterService.getDynamicFilteringStats(queryId, session);
assertEquals(stats.getTotalDynamicFilters(), 3);
assertEquals(stats.getDynamicFiltersCompleted(), 0);
assertEquals(stats.getLazyDynamicFilters(), 3);
assertEquals(stats.getReplicatedDynamicFilters(), 0);
// dynamic filter should be blocked waiting for tuple domain to be provided
CompletableFuture<?> blockedFuture = dynamicFilter.isBlocked();
assertFalse(blockedFuture.isDone());
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId1, 0, 0), ImmutableMap.of(filterId1, singleValue(INTEGER, 1L)));
// tuple domain from two tasks are needed for dynamic filter to be narrowed down
assertTrue(dynamicFilter.getCurrentPredicate().isAll());
assertFalse(dynamicFilter.isComplete());
assertTrue(dynamicFilter.isAwaitable());
assertFalse(blockedFuture.isDone());
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId1, 1, 0), ImmutableMap.of(filterId1, singleValue(INTEGER, 2L)));
// dynamic filter (id1) has been collected as tuple domains from two tasks have been provided
assertEquals(dynamicFilter.getCurrentPredicate(), TupleDomain.withColumnDomains(ImmutableMap.of(new TestingColumnHandle("probeColumnA"), multipleValues(INTEGER, ImmutableList.of(1L, 2L)))));
assertTrue(blockedFuture.isDone());
assertFalse(blockedFuture.isCompletedExceptionally());
stats = dynamicFilterService.getDynamicFilteringStats(queryId, session);
assertEquals(stats.getDynamicFiltersCompleted(), 1);
// there are still more dynamic filters to be collected
assertFalse(dynamicFilter.isComplete());
assertTrue(dynamicFilter.isAwaitable());
blockedFuture = dynamicFilter.isBlocked();
assertFalse(blockedFuture.isDone());
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId2, 0, 0), ImmutableMap.of(filterId2, singleValue(INTEGER, 2L)));
// tuple domain from two tasks (stage 2) are needed for dynamic filter to be narrowed down
assertEquals(dynamicFilter.getCurrentPredicate(), TupleDomain.withColumnDomains(ImmutableMap.of(new TestingColumnHandle("probeColumnA"), multipleValues(INTEGER, ImmutableList.of(1L, 2L)))));
assertFalse(dynamicFilter.isComplete());
assertTrue(dynamicFilter.isAwaitable());
assertFalse(blockedFuture.isDone());
stats = dynamicFilterService.getDynamicFilteringStats(queryId, session);
assertEquals(stats.getDynamicFiltersCompleted(), 1);
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId2, 1, 0), ImmutableMap.of(filterId2, singleValue(INTEGER, 3L)));
// dynamic filter (id2) has been collected as tuple domains from two tasks have been provided
assertEquals(dynamicFilter.getCurrentPredicate(), TupleDomain.withColumnDomains(ImmutableMap.of(new TestingColumnHandle("probeColumnA"), singleValue(INTEGER, 2L))));
assertTrue(blockedFuture.isDone());
assertFalse(blockedFuture.isCompletedExceptionally());
stats = dynamicFilterService.getDynamicFilteringStats(queryId, session);
assertEquals(stats.getDynamicFiltersCompleted(), 2);
// there are still more dynamic filters to be collected for columns A and B
assertFalse(dynamicFilter.isComplete());
assertTrue(dynamicFilter.isAwaitable());
blockedFuture = dynamicFilter.isBlocked();
assertFalse(blockedFuture.isDone());
// make sure dynamic filter on just column A is now completed
DynamicFilter dynamicFilterColumnA = dynamicFilterService.createDynamicFilter(queryId, ImmutableList.of(new DynamicFilters.Descriptor(filterId1, df1), new DynamicFilters.Descriptor(filterId2, df2)), ImmutableMap.of(symbol1, new TestingColumnHandle("probeColumnA"), symbol2, new TestingColumnHandle("probeColumnA")), symbolAllocator.getTypes());
assertEquals(dynamicFilterColumnA.getColumnsCovered(), Set.of(new TestingColumnHandle("probeColumnA")), "columns covered");
assertTrue(dynamicFilterColumnA.isComplete());
assertFalse(dynamicFilterColumnA.isAwaitable());
assertTrue(dynamicFilterColumnA.isBlocked().isDone());
assertEquals(dynamicFilterColumnA.getCurrentPredicate(), TupleDomain.withColumnDomains(ImmutableMap.of(new TestingColumnHandle("probeColumnA"), singleValue(INTEGER, 2L))));
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId3, 0, 0), ImmutableMap.of(filterId3, none(INTEGER)));
// tuple domain from two tasks (stage 3) are needed for dynamic filter to be narrowed down
assertEquals(dynamicFilter.getCurrentPredicate(), TupleDomain.withColumnDomains(ImmutableMap.of(new TestingColumnHandle("probeColumnA"), singleValue(INTEGER, 2L))));
assertFalse(dynamicFilter.isComplete());
assertTrue(dynamicFilter.isAwaitable());
assertFalse(blockedFuture.isDone());
stats = dynamicFilterService.getDynamicFilteringStats(queryId, session);
assertEquals(stats.getDynamicFiltersCompleted(), 2);
dynamicFilterService.addTaskDynamicFilters(new TaskId(stageId3, 1, 0), ImmutableMap.of(filterId3, none(INTEGER)));
// "none" dynamic filter (id3) has been collected for column B as tuple domains from two tasks have been provided
assertEquals(dynamicFilter.getCurrentPredicate(), TupleDomain.none());
assertTrue(blockedFuture.isDone());
assertFalse(blockedFuture.isCompletedExceptionally());
stats = dynamicFilterService.getDynamicFilteringStats(queryId, session);
assertEquals(stats.getDynamicFiltersCompleted(), 3);
assertEquals(stats.getLazyDynamicFilters(), 3);
assertEquals(stats.getReplicatedDynamicFilters(), 0);
assertEquals(ImmutableSet.copyOf(stats.getDynamicFilterDomainStats()), ImmutableSet.of(new DynamicFilterDomainStats(filterId1, getSimplifiedDomainString(1L, 2L, 2, INTEGER)), new DynamicFilterDomainStats(filterId2, getSimplifiedDomainString(2L, 3L, 2, INTEGER)), new DynamicFilterDomainStats(filterId3, Domain.none(INTEGER).toString(session.toConnectorSession()))));
// all dynamic filters have been collected, no need for more requests
assertTrue(dynamicFilter.isComplete());
assertFalse(dynamicFilter.isAwaitable());
assertTrue(dynamicFilter.isBlocked().isDone());
}
use of io.trino.server.DynamicFilterService.DynamicFilterDomainStats in project trino by trinodb.
the class BaseDynamicPartitionPruningTest method testJoinWithImplicitCoercion.
@Test(timeOut = 30_000)
public void testJoinWithImplicitCoercion() {
// setup partitioned fact table with integer suppkey
createLineitemTable("partitioned_lineitem_int", ImmutableList.of("orderkey", "CAST(suppkey as int) suppkey_int"), ImmutableList.of("suppkey_int"));
assertQuery("SELECT count(*) FROM partitioned_lineitem_int", "VALUES " + LINEITEM_COUNT);
@Language("SQL") String selectQuery = "SELECT * FROM partitioned_lineitem_int l JOIN supplier s ON l.suppkey_int = s.suppkey AND s.name = 'Supplier#000000001'";
ResultWithQueryId<MaterializedResult> result = getDistributedQueryRunner().executeWithQueryId(getSession(), selectQuery);
MaterializedResult expected = computeActual(withDynamicFilteringDisabled(), selectQuery);
assertEqualsIgnoreOrder(result.getResult(), expected);
OperatorStats probeStats = searchScanFilterAndProjectOperatorStats(result.getQueryId(), getQualifiedTableName("partitioned_lineitem_int"));
// Probe-side is partially scanned
assertEquals(probeStats.getInputPositions(), 615L);
DynamicFiltersStats dynamicFiltersStats = getDynamicFilteringStats(result.getQueryId());
assertEquals(dynamicFiltersStats.getTotalDynamicFilters(), 1L);
assertEquals(dynamicFiltersStats.getLazyDynamicFilters(), 1L);
assertEquals(dynamicFiltersStats.getReplicatedDynamicFilters(), 0L);
assertEquals(dynamicFiltersStats.getDynamicFiltersCompleted(), 1L);
DynamicFilterDomainStats domainStats = getOnlyElement(dynamicFiltersStats.getDynamicFilterDomainStats());
assertEquals(domainStats.getSimplifiedDomain(), singleValue(BIGINT, 1L).toString(getSession().toConnectorSession()));
}
use of io.trino.server.DynamicFilterService.DynamicFilterDomainStats in project trino by trinodb.
the class BaseDynamicPartitionPruningTest method testSemiJoinLargeBuildSideRangeDynamicFiltering.
@Test(timeOut = 30_000)
public void testSemiJoinLargeBuildSideRangeDynamicFiltering() {
@Language("SQL") String selectQuery = "SELECT * FROM partitioned_lineitem WHERE orderkey IN (SELECT orderkey FROM orders)";
ResultWithQueryId<MaterializedResult> result = getDistributedQueryRunner().executeWithQueryId(getSession(), selectQuery);
MaterializedResult expected = computeActual(withDynamicFilteringDisabled(), selectQuery);
assertEqualsIgnoreOrder(result.getResult(), expected);
OperatorStats probeStats = searchScanFilterAndProjectOperatorStats(result.getQueryId(), getQualifiedTableName(PARTITIONED_LINEITEM));
// Probe-side is fully scanned because the build-side is too large for dynamic filtering
assertEquals(probeStats.getInputPositions(), LINEITEM_COUNT);
DynamicFiltersStats dynamicFiltersStats = getDynamicFilteringStats(result.getQueryId());
assertEquals(dynamicFiltersStats.getTotalDynamicFilters(), 1L);
assertEquals(dynamicFiltersStats.getLazyDynamicFilters(), 1L);
assertEquals(dynamicFiltersStats.getReplicatedDynamicFilters(), 0L);
assertEquals(dynamicFiltersStats.getDynamicFiltersCompleted(), 1L);
DynamicFilterDomainStats domainStats = getOnlyElement(dynamicFiltersStats.getDynamicFilterDomainStats());
assertEquals(domainStats.getSimplifiedDomain(), Domain.create(ValueSet.ofRanges(range(BIGINT, 1L, true, 60000L, true)), false).toString(getSession().toConnectorSession()));
}
Aggregations