Compare commits

...

2 Commits

Author SHA1 Message Date
Andrew Kane
7132c9b111 Use fabs [skip ci] 2023-05-05 18:34:15 -07:00
Andrew Kane
878e1e6c3a Added query-aware dynamic pruning [skip ci] 2023-05-05 18:13:56 -07:00
2 changed files with 12 additions and 1 deletions

View File

@@ -206,6 +206,7 @@ typedef struct IvfflatScanOpaqueData
/* Lists */
pairingheap *listQueue;
double minDistance;
IvfflatScanList lists[FLEXIBLE_ARRAY_MEMBER]; /* must come last */
} IvfflatScanOpaqueData;

View File

@@ -60,6 +60,9 @@ GetScanLists(IndexScanDesc scan, Datum value)
/* Use procinfo from the index instead of scan key for performance */
distance = DatumGetFloat8(FunctionCall2Coll(so->procinfo, so->collation, PointerGetDatum(&list->center), value));
if (distance < so->minDistance)
so->minDistance = distance;
if (listCount < so->probes)
{
scanlist = &so->lists[listCount];
@@ -129,7 +132,13 @@ GetScanItems(IndexScanDesc scan, Datum value)
/* Search closest probes lists */
while (!pairingheap_is_empty(so->listQueue))
{
searchPage = ((IvfflatScanList *) pairingheap_remove_first(so->listQueue))->startPage;
IvfflatScanList *scanlist = (IvfflatScanList *) pairingheap_remove_first(so->listQueue);
/* Query-aware dynamic pruning */
if (fabs(scanlist->distance) > 1.5 * fabs(so->minDistance))
continue;
searchPage = scanlist->startPage;
/* Search all entry pages for list */
while (BlockNumberIsValid(searchPage))
@@ -252,6 +261,7 @@ ivfflatrescan(IndexScanDesc scan, ScanKey keys, int nkeys, ScanKey orderbys, int
so->first = true;
pairingheap_reset(so->listQueue);
so->minDistance = DBL_MAX;
if (keys && scan->numberOfKeys > 0)
memmove(scan->keyData, keys, scan->numberOfKeys * sizeof(ScanKeyData));