Commit Graph
1551 Commits
Author SHA1 Message Date
Andrew Kane 772960ccdf Improved HnswUpdateConnection parameters [skip ci] 2024-09-29 19:47:25 -07:00
Andrew Kane 975cd87356 Moved insert-specific code to hnswinsert.c 2024-09-29 19:44:11 -07:00
Andrew Kane e03f809b17 Improved variable name [skip ci] 2024-09-29 19:26:15 -07:00
Andrew Kane 7d35acca8c Improved variable names [skip ci] 2024-09-29 19:22:35 -07:00
Andrew Kane f7252f9327 Moved LoadElementsForInsert to separate function and removed unused code path 2024-09-29 19:12:38 -07:00
Andrew Kane 14cf1ff707 Use HnswLoadNeighborTids for inserts 2024-09-29 18:52:12 -07:00
Andrew Kane 4134ad7db4 Removed lc from HnswUpdateConnection [skip ci] 2024-09-29 18:18:42 -07:00
Andrew Kane b2cf4fec08 Removed lc from SelectNeighbors [skip ci] 2024-09-29 18:14:28 -07:00
Andrew Kane c6bdcec753 Split loading neighbor TIDs into separate function [skip ci] 2024-09-29 17:20:54 -07:00
Andrew Kane 5769993a5e Moved HnswLoadNeighbors to hnswinsert.c [skip ci] 2024-09-29 15:49:01 -07:00
Andrew Kane dcce5779c0 Use sc for search candidates [skip ci] 2024-09-29 15:09:54 -07:00
Andrew Kane 973cce6b91 Updated distance to use double 2024-09-29 15:06:50 -07:00
Andrew Kane 55927ffcec Fixed uninitialized variable [skip ci] 2024-09-28 19:18:52 -07:00
Andrew Kane 25c2630a5f Added distance filters to cost tests [skip ci] 2024-09-28 14:50:23 -07:00
Andrew Kane f71cb1931f Updated readme [skip ci] 2024-09-28 09:23:41 -07:00
Andrew Kane 4077f866d7 Updated default Postgres version in Dockerfile [skip ci] 2024-09-27 16:19:57 -07:00
Andrew Kane 423c8dc2fb Updated Postgres version for Docker [skip ci] 2024-09-27 16:19:06 -07:00
Andrew Kane f0cc795e66 Added note about Postgres 17 on Windows - #669 [skip ci] 2024-09-27 14:05:36 -07:00
Andrew Kane 488e1c6bc3 Updated package versions in readme [skip ci] 2024-09-27 13:52:11 -07:00
Andrew Kane 4d6d2e3690 Restored quarterly package version for FreeBSD in readme [skip ci] 2024-09-27 13:50:57 -07:00
Andrew Kane 274a779a20 Updated package versions in readme [skip ci] 2024-09-27 13:49:43 -07:00
Andrew Kane c85bb5b6e3 Added note about postgresql@17 formula [skip ci] 2024-09-27 13:39:54 -07:00
Andrew Kane 47c51a51b9 Added safety check [skip ci] 2024-09-26 08:32:44 -07:00
Andrew Kane 6dd6a34108 Updated changelog [skip ci] 2024-09-25 16:03:58 -07:00
Andrew Kane 5a65093099 Improved test [skip ci] 2024-09-25 15:58:41 -07:00
Andrew Kane c3df866d4c Added test for IVFFlat costs [skip ci] 2024-09-25 15:53:34 -07:00
Andrew Kane 80db0c7b2c Added test for costs [skip ci] 2024-09-25 15:49:03 -07:00
Andrew Kane 2dafed307e Only adjust for TOAST [skip ci] 2024-09-25 15:39:56 -07:00
Andrew Kane f958b533f7 Added same cost adjustment to HNSW as IVFFlat since TOAST not included in seq scan cost - #682 [skip ci] 2024-09-25 15:33:57 -07:00
Andrew Kane a6b7acf3e7 Removed unneeded floor and fixed comment formatting [skip ci] 2024-09-25 14:13:02 -07:00
Andrew Kane 15f312fed1 Ran pgindent [skip ci] 2024-09-25 14:03:51 -07:00
9371ba7f43 Update HNSW cost estimatation to utilize search and index info (#682)
Previously, the cost estimation formula for a HNSW index scan utilized
a methodology that only factored in the entry level for an HNSW scan
and the "m" index parameter, which reflects the number of tuples (or
vectors) to scan at each step of a HNSW graph traversal. While this
would bias the PostgreSQL query planner to choose an HNSW index scan
over other available paths, this could lead to potential suboptimal
index selection, for example, choosing to use a HNSW index instead of
an available B-tree index that has better selectivity.

The number of tuples scanned during HNSW graph traversal is principally
influenced by these factors:

 * The number of tuples stored in the index
 * `m` - the number of tuples that are scanned in each step of the graph
   traversal
 * `hnsw.ef_search` - which influences the total number of steps it
   takes for the scan to converge on the approximated nearest neighbors

Through testing different source models for vectors, we also observed
that the correlation of vectors in mdoels would impact this convergence.
For this first iteration, we've opted to hardcode a constant scaling
factor and set it to `0.55`, though a future commit may turn this into
a configurable parameter.

The high-level formula for estimating the cost of a HNSW index scan is
as such:

```
(entryLevel * m) + (layer0TuplesMax * layer0Selectivity)
```

where

- `(entryLevel * m)` is the lower bound of tuples to scan, as it
accounts for the graph traversal to layer 0 (L0). (L1 and above has an ef=1)
- `layer0TuplesMax` is an estimate of the maximum number of tuples to
scan at L0. This accounts for tuples that may end up being discarded due
to them already being visited. Testing shows that the number of steps
until converge is similar to the value of `hnsw.ef_search`, thus we can
estimate tuples max at `hnsw.ef_search * m * 2`
- `layer0Selectivity` - estimates the percentage of tuples that will
actually be scanned during the index traversal, multipled by the scaling
factor

In addition to the `m` build parameter and `hsnw.ef_search`, costs
estimates can be influenced by standard PostgreSQL costing parameters,
though adjusting those (e.g. `random_page_cost`) should be done with
care.

Co-authored-by: @ankane
2024-09-25 14:01:33 -07:00
Andrew Kane fb7c86e572 Do not adjust index selectivity based on probes [skip ci] 2024-09-25 13:48:24 -07:00
Andrew Kane 81a7ac3f56 Added test for join with attribute filtering [skip ci] 2024-09-24 23:21:34 -07:00
Andrew Kane 079133f821 Improved test [skip ci] 2024-09-24 23:13:30 -07:00
Andrew Kane 5ef14ea3aa Added test for join [skip ci] 2024-09-24 23:12:27 -07:00
Andrew Kane 11c72a711d Removed code for Postgres 12 [skip ci] 2024-09-23 15:26:31 -07:00
Andrew Kane db196c0dd5 Free TupleDesc [skip ci] 2024-09-21 19:15:34 -07:00
Andrew Kane 204dd71b81 Moved allocations out of GetScanItems [skip ci] 2024-09-21 19:10:25 -07:00
Andrew Kane 10712d2f37 Added macros for IvfflatScanList [skip ci] 2024-09-21 18:10:37 -07:00
Andrew Kane c0e2c23acc Changed HnswPairingHeapNode to HnswSearchCandidate to reduce allocations and improve code 2024-09-21 12:07:44 -07:00
Andrew Kane f6b040eea9 Improved code [skip ci] 2024-09-20 15:21:57 -07:00
Andrew Kane b7343d7863 Fixed CI 2024-09-19 20:50:51 -07:00
Andrew Kane bae726a4c6 Improved code [skip ci] 2024-09-19 19:57:16 -07:00
Andrew Kane 5cf1e7b99e Fixed array_to_sparsevec on Windows [skip ci] 2024-09-19 19:52:16 -07:00
f37b369f00 Added casts for arrays to sparsevec - #604
Co-authored-by: Narek Galstyan <[email protected]>
Co-authored-by: Di Qi <[email protected]>
2024-09-19 19:17:05 -07:00
Andrew Kane ca2ebbc623 Dropped support for Postgres 12 2024-09-19 18:13:54 -07:00
Heikki LinnakangasandGitHub 6c3178bb87 Add error codes to a few errors (#657)
With elog(), you get XX000 "internal_error", which sounds scary.

It's not self-evident what the right error codes for some of these
errors are, but I tried to use my best judgment.
2024-09-19 18:04:23 -07:00
Andrew Kane 4a8a81a036 Updated changelog [skip ci] 2024-09-19 18:03:20 -07:00
Jonathan S. KatzandGitHub 091a854aee Swap max costing values to align with upstream guidance (#658)
A feature targeted for PostgreSQL 18 (postgres/postgres@e2225346)
that makes optimizations around disabled path nodes impacted pgvector
such that PostgreSQL would choose to perform an index scan when it
should have used a different scan (e.g. `SELECT count(*) FROM table`).
Per upstream guidance[1], the recommendation is to switch to using
`get_float8_infinity()`, which achieves the same behavior in backbranches,
and can be adapated to work with the new behavior introduced in PostgreSQL 18.

[1] https://www.postgresql.org/message-id/2281822.1724441531%40sss.pgh.pa.us
2024-09-19 18:01:59 -07:00