Respect optimize_skip_unused_shards_rewrite_in with optimize_skip_unused_shards_limit

This commit is contained in:
Azat Khuzhin 2021-03-29 22:02:34 +03:00
parent e439914d38
commit 79bd8d4d3f
5 changed files with 22 additions and 8 deletions

View File

@ -107,7 +107,7 @@ void executeQuery(
Pipes remote_pipes;
Pipes delayed_pipes;
auto new_context = updateSettingsForCluster(*query_info.cluster, context, settings, log);
auto new_context = updateSettingsForCluster(*query_info.getCluster(), context, settings, log);
new_context->getClientInfo().distributed_depth += 1;
@ -128,11 +128,11 @@ void executeQuery(
else
throttler = user_level_throttler;
size_t shards = query_info.cluster->getShardCount();
for (const auto & shard_info : query_info.cluster->getShardsInfo())
size_t shards = query_info.getCluster()->getShardCount();
for (const auto & shard_info : query_info.getCluster()->getShardsInfo())
{
ASTPtr query_ast_for_shard;
if (settings.optimize_skip_unused_shards && settings.optimize_skip_unused_shards_rewrite_in && shards > 1)
if (query_info.optimized_cluster && settings.optimize_skip_unused_shards_rewrite_in && shards > 1)
{
query_ast_for_shard = query_ast->clone();

View File

@ -119,9 +119,13 @@ struct SelectQueryInfo
ASTPtr query;
ASTPtr view_query; /// Optimized VIEW query
/// For optimize_skip_unused_shards.
/// Can be modified in getQueryProcessingStage()
/// Cluster for the query.
ClusterPtr cluster;
/// Optimized cluster for the query.
/// In case of optimize_skip_unused_shards it may differs from original cluster.
///
/// Configured in StorageDistributed::getQueryProcessingStage()
ClusterPtr optimized_cluster;
TreeRewriterResultPtr syntax_analyzer_result;
@ -134,6 +138,8 @@ struct SelectQueryInfo
/// Prepared sets are used for indices by storage engine.
/// Example: x IN (1, 2, 3)
PreparedSets sets;
ClusterPtr getCluster() const { return !optimized_cluster ? cluster : optimized_cluster; }
};
}

View File

@ -478,7 +478,7 @@ QueryProcessingStage::Enum StorageDistributed::getQueryProcessingStage(
"Skipping irrelevant shards - the query will be sent to the following shards of the cluster (shard numbers): {}",
makeFormattedListOfShards(optimized_cluster));
cluster = optimized_cluster;
query_info.cluster = cluster;
query_info.optimized_cluster = cluster;
}
else
{
@ -558,7 +558,7 @@ void StorageDistributed::read(
InterpreterSelectQuery(query_info.query, local_context, SelectQueryOptions(processed_stage).analyze()).getSampleBlock();
/// Return directly (with correct header) if no shard to query.
if (query_info.cluster->getShardsInfo().empty())
if (query_info.getCluster()->getShardsInfo().empty())
{
Pipe pipe(std::make_shared<NullSource>(header));
auto read_from_pipe = std::make_unique<ReadFromPreparedSource>(std::move(pipe));

View File

@ -17,3 +17,6 @@ others
0
0
0
optimize_skip_unused_shards_limit
0
0

View File

@ -114,3 +114,8 @@ select * from dist_01756_str where key in ('0', '2');
select * from dist_01756_str where key in ('0', Null); -- { serverError 507 }
select * from dist_01756_str where key in (0, 2); -- { serverError 53 }
select * from dist_01756_str where key in (0, Null); -- { serverError 53 }
-- optimize_skip_unused_shards_limit
select 'optimize_skip_unused_shards_limit';
select * from dist_01756 where dummy in (0, 2) settings optimize_skip_unused_shards_limit=1; -- { serverError 507 }
select * from dist_01756 where dummy in (0, 2) settings optimize_skip_unused_shards_limit=1, force_optimize_skip_unused_shards=0;