mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Add TID Range Scans to support efficient scanning ranges of TIDs
This adds a new executor node named TID Range Scan. The query planner will generate paths for TID Range scans when quals are discovered on base relations which search for ranges on the table's ctid column. These ranges may be open at either end. For example, WHERE ctid >= '(10,0)'; will return all tuples on page 10 and over. To support this, two new optional callback functions have been added to table AM. scan_set_tidrange is used to set the scan range to just the given range of TIDs. scan_getnextslot_tidrange fetches the next tuple in the given range. For AMs were scanning ranges of TIDs would not make sense, these functions can be set to NULL in the TableAmRoutine. The query planner won't generate TID Range Scan Paths in that case. Author: Edmund Horner, David Rowley Reviewed-by: David Rowley, Tomas Vondra, Tom Lane, Andres Freund, Zhihong Yu Discussion: https://postgr.es/m/CAMyN-kB-nFTkF=VA_JPwFNo08S0d-Yk0F741S2B7LDmYAi8eyA@mail.gmail.com
This commit is contained in:
@ -1057,6 +1057,7 @@ ExplainPreScanNode(PlanState *planstate, Bitmapset **rels_used)
|
||||
case T_IndexOnlyScan:
|
||||
case T_BitmapHeapScan:
|
||||
case T_TidScan:
|
||||
case T_TidRangeScan:
|
||||
case T_SubqueryScan:
|
||||
case T_FunctionScan:
|
||||
case T_TableFuncScan:
|
||||
@ -1223,6 +1224,9 @@ ExplainNode(PlanState *planstate, List *ancestors,
|
||||
case T_TidScan:
|
||||
pname = sname = "Tid Scan";
|
||||
break;
|
||||
case T_TidRangeScan:
|
||||
pname = sname = "Tid Range Scan";
|
||||
break;
|
||||
case T_SubqueryScan:
|
||||
pname = sname = "Subquery Scan";
|
||||
break;
|
||||
@ -1417,6 +1421,7 @@ ExplainNode(PlanState *planstate, List *ancestors,
|
||||
case T_SampleScan:
|
||||
case T_BitmapHeapScan:
|
||||
case T_TidScan:
|
||||
case T_TidRangeScan:
|
||||
case T_SubqueryScan:
|
||||
case T_FunctionScan:
|
||||
case T_TableFuncScan:
|
||||
@ -1871,6 +1876,23 @@ ExplainNode(PlanState *planstate, List *ancestors,
|
||||
planstate, es);
|
||||
}
|
||||
break;
|
||||
case T_TidRangeScan:
|
||||
{
|
||||
/*
|
||||
* The tidrangequals list has AND semantics, so be sure to
|
||||
* show it as an AND condition.
|
||||
*/
|
||||
List *tidquals = ((TidRangeScan *) plan)->tidrangequals;
|
||||
|
||||
if (list_length(tidquals) > 1)
|
||||
tidquals = list_make1(make_andclause(tidquals));
|
||||
show_scan_qual(tidquals, "TID Cond", planstate, ancestors, es);
|
||||
show_scan_qual(plan->qual, "Filter", planstate, ancestors, es);
|
||||
if (plan->qual)
|
||||
show_instrumentation_count("Rows Removed by Filter", 1,
|
||||
planstate, es);
|
||||
}
|
||||
break;
|
||||
case T_ForeignScan:
|
||||
show_scan_qual(plan->qual, "Filter", planstate, ancestors, es);
|
||||
if (plan->qual)
|
||||
@ -3558,6 +3580,7 @@ ExplainTargetRel(Plan *plan, Index rti, ExplainState *es)
|
||||
case T_IndexOnlyScan:
|
||||
case T_BitmapHeapScan:
|
||||
case T_TidScan:
|
||||
case T_TidRangeScan:
|
||||
case T_ForeignScan:
|
||||
case T_CustomScan:
|
||||
case T_ModifyTable:
|
||||
|
Reference in New Issue
Block a user