mirror of https://github.com/citusdata/citus.git
Use an index to get FDWs that depend on extensions (#7574)
DESCRIPTION: Fix performance issue when distributing a table that depends on an extension When the database contains many objects this function would show up in profiles because it was doing a sequence scan on pg_depend. And with many objects pg_depend can get very large. This starts using an index scan to only look for rows containing FDWs, of which there are expected to be very few (often even zero).pull/7580/head^2
parent
cdf51da458
commit
16604a6601
|
@ -1093,33 +1093,26 @@ List *
|
||||||
GetDependentFDWsToExtension(Oid extensionId)
|
GetDependentFDWsToExtension(Oid extensionId)
|
||||||
{
|
{
|
||||||
List *extensionFDWs = NIL;
|
List *extensionFDWs = NIL;
|
||||||
ScanKeyData key[3];
|
ScanKeyData key[1];
|
||||||
int scanKeyCount = 3;
|
|
||||||
HeapTuple tup;
|
HeapTuple tup;
|
||||||
|
|
||||||
Relation pgDepend = table_open(DependRelationId, AccessShareLock);
|
Relation pgDepend = table_open(DependRelationId, AccessShareLock);
|
||||||
|
|
||||||
ScanKeyInit(&key[0],
|
ScanKeyInit(&key[0],
|
||||||
Anum_pg_depend_refclassid,
|
|
||||||
BTEqualStrategyNumber, F_OIDEQ,
|
|
||||||
ObjectIdGetDatum(ExtensionRelationId));
|
|
||||||
ScanKeyInit(&key[1],
|
|
||||||
Anum_pg_depend_refobjid,
|
|
||||||
BTEqualStrategyNumber, F_OIDEQ,
|
|
||||||
ObjectIdGetDatum(extensionId));
|
|
||||||
ScanKeyInit(&key[2],
|
|
||||||
Anum_pg_depend_classid,
|
Anum_pg_depend_classid,
|
||||||
BTEqualStrategyNumber, F_OIDEQ,
|
BTEqualStrategyNumber, F_OIDEQ,
|
||||||
ObjectIdGetDatum(ForeignDataWrapperRelationId));
|
ObjectIdGetDatum(ForeignDataWrapperRelationId));
|
||||||
|
|
||||||
SysScanDesc scan = systable_beginscan(pgDepend, InvalidOid, false,
|
SysScanDesc scan = systable_beginscan(pgDepend, DependDependerIndexId, true,
|
||||||
NULL, scanKeyCount, key);
|
NULL, lengthof(key), key);
|
||||||
|
|
||||||
while (HeapTupleIsValid(tup = systable_getnext(scan)))
|
while (HeapTupleIsValid(tup = systable_getnext(scan)))
|
||||||
{
|
{
|
||||||
Form_pg_depend pgDependEntry = (Form_pg_depend) GETSTRUCT(tup);
|
Form_pg_depend pgDependEntry = (Form_pg_depend) GETSTRUCT(tup);
|
||||||
|
|
||||||
if (pgDependEntry->deptype == DEPENDENCY_EXTENSION)
|
if (pgDependEntry->deptype == DEPENDENCY_EXTENSION &&
|
||||||
|
pgDependEntry->refclassid == ExtensionRelationId &&
|
||||||
|
pgDependEntry->refobjid == extensionId)
|
||||||
{
|
{
|
||||||
extensionFDWs = lappend_oid(extensionFDWs, pgDependEntry->objid);
|
extensionFDWs = lappend_oid(extensionFDWs, pgDependEntry->objid);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue