mirror of https://github.com/citusdata/citus.git
Skip exhaustive test in CoPartitionedTables() if declared colocated.
That's considerably cheaper.pull/1354/head
parent
1798d4648d
commit
71a7f39b05
|
@ -27,6 +27,7 @@
|
||||||
#include "commands/extension.h"
|
#include "commands/extension.h"
|
||||||
#include "distributed/citus_nodes.h"
|
#include "distributed/citus_nodes.h"
|
||||||
#include "distributed/citus_ruleutils.h"
|
#include "distributed/citus_ruleutils.h"
|
||||||
|
#include "distributed/colocation_utils.h"
|
||||||
#include "distributed/metadata_cache.h"
|
#include "distributed/metadata_cache.h"
|
||||||
#include "distributed/multi_logical_optimizer.h"
|
#include "distributed/multi_logical_optimizer.h"
|
||||||
#include "distributed/multi_logical_planner.h"
|
#include "distributed/multi_logical_planner.h"
|
||||||
|
@ -3960,10 +3961,8 @@ RelationIdList(Query *query)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CoPartitionedTables checks if given two distributed tables have 1-to-1 shard
|
* CoPartitionedTables checks if given two distributed tables have 1-to-1
|
||||||
* partitioning. It uses shard interval array that are sorted on interval minimum
|
* shard partitioning.
|
||||||
* values. Then it compares every shard interval in order and if any pair of
|
|
||||||
* shard intervals are not equal it returns false.
|
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
CoPartitionedTables(Oid firstRelationId, Oid secondRelationId)
|
CoPartitionedTables(Oid firstRelationId, Oid secondRelationId)
|
||||||
|
@ -3992,6 +3991,22 @@ CoPartitionedTables(Oid firstRelationId, Oid secondRelationId)
|
||||||
|
|
||||||
Assert(comparisonFunction != NULL);
|
Assert(comparisonFunction != NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if the tables have the same colocation ID - if so, we know
|
||||||
|
* they're colocated.
|
||||||
|
*/
|
||||||
|
if (firstTableCache->colocationId != INVALID_COLOCATION_ID &&
|
||||||
|
firstTableCache->colocationId == secondTableCache->colocationId)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If not known to be colocated check if the remaining shards are
|
||||||
|
* anyway. Do so by comparing the shard interval arrays that are sorted on
|
||||||
|
* interval minimum values. Then it compares every shard interval in order
|
||||||
|
* and if any pair of shard intervals are not equal it returns false.
|
||||||
|
*/
|
||||||
for (intervalIndex = 0; intervalIndex < firstListShardCount; intervalIndex++)
|
for (intervalIndex = 0; intervalIndex < firstListShardCount; intervalIndex++)
|
||||||
{
|
{
|
||||||
ShardInterval *firstInterval = sortedFirstIntervalArray[intervalIndex];
|
ShardInterval *firstInterval = sortedFirstIntervalArray[intervalIndex];
|
||||||
|
|
Loading…
Reference in New Issue