mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-22 20:15:46 +08:00
Compare commits
13 Commits
windows-ar
...
hnsw-prefe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e5e0cf7b5 | ||
|
|
bbe7135ae4 | ||
|
|
7b58352336 | ||
|
|
83d410eae9 | ||
|
|
ebbfe8dba0 | ||
|
|
e575866297 | ||
|
|
35f4f7fc80 | ||
|
|
32e95a8598 | ||
|
|
a03dc5b7d0 | ||
|
|
d365aac370 | ||
|
|
05182479a2 | ||
|
|
cc0958dec5 | ||
|
|
4af2b06dc5 |
10
.github/workflows/build.yml
vendored
10
.github/workflows/build.yml
vendored
@@ -13,13 +13,13 @@ jobs:
|
||||
- postgres: 17
|
||||
os: ubuntu-24.04
|
||||
- postgres: 16
|
||||
os: ubuntu-22.04
|
||||
os: ubuntu-24.04-arm
|
||||
- postgres: 15
|
||||
os: ubuntu-22.04
|
||||
- postgres: 14
|
||||
os: ubuntu-20.04
|
||||
os: ubuntu-22.04-arm
|
||||
- postgres: 13
|
||||
os: ubuntu-20.04
|
||||
os: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ankane/setup-postgres@v1
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
dev-files: true
|
||||
- run: make
|
||||
env:
|
||||
PG_CFLAGS: -DUSE_ASSERT_CHECKING -Wall -Wextra -Werror -Wno-unused-parameter -Wno-sign-compare
|
||||
PG_CFLAGS: ${{ matrix.postgres == 18 && '-Wno-missing-field-initializers' || '' }} -DUSE_ASSERT_CHECKING -Wall -Wextra -Werror -Wno-unused-parameter -Wno-sign-compare
|
||||
- run: |
|
||||
export PG_CONFIG=`which pg_config`
|
||||
sudo --preserve-env=PG_CONFIG make install
|
||||
@@ -87,7 +87,7 @@ jobs:
|
||||
with:
|
||||
postgres-version: 14
|
||||
- run: |
|
||||
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars32.bat" && ^
|
||||
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" && ^
|
||||
nmake /NOLOGO /F Makefile.win && ^
|
||||
nmake /NOLOGO /F Makefile.win install && ^
|
||||
nmake /NOLOGO /F Makefile.win installcheck && ^
|
||||
|
||||
12
README.md
12
README.md
@@ -318,7 +318,9 @@ You can also speed up index creation by increasing the number of parallel worker
|
||||
SET max_parallel_maintenance_workers = 7; -- plus leader
|
||||
```
|
||||
|
||||
For a large number of workers, you may also need to increase `max_parallel_workers` (8 by default)
|
||||
For a large number of workers, you may need to increase `max_parallel_workers` (8 by default)
|
||||
|
||||
The [index options](#index-options) also have a significant impact on build time (use the defaults unless seeing low recall)
|
||||
|
||||
### Indexing Progress
|
||||
|
||||
@@ -475,8 +477,6 @@ CREATE TABLE items (embedding vector(3), category_id int) PARTITION BY LIST(cate
|
||||
|
||||
## Iterative Index Scans
|
||||
|
||||
*Added in 0.8.0*
|
||||
|
||||
With approximate indexes, queries with filtering can return less results since filtering is applied *after* the index is scanned. Starting with 0.8.0, you can enable iterative index scans, which will automatically scan more of the index until enough results are found (or it reaches `hnsw.max_scan_tuples` or `ivfflat.max_probes`).
|
||||
|
||||
Iterative scans can use strict or relaxed ordering.
|
||||
@@ -754,8 +754,6 @@ SELECT query, calls, ROUND((total_plan_time + total_exec_time) / calls) AS avg_t
|
||||
FROM pg_stat_statements ORDER BY total_plan_time + total_exec_time DESC LIMIT 20;
|
||||
```
|
||||
|
||||
Note: Replace `total_plan_time + total_exec_time` with `total_time` for Postgres < 13
|
||||
|
||||
Monitor recall by comparing results from approximate search with exact search.
|
||||
|
||||
```sql
|
||||
@@ -824,7 +822,7 @@ You can use [half-precision indexing](#half-precision-indexing) to index up to 4
|
||||
|
||||
#### Can I store vectors with different dimensions in the same column?
|
||||
|
||||
You can use `vector` as the type (instead of `vector(3)`).
|
||||
You can use `vector` as the type (instead of `vector(n)`).
|
||||
|
||||
```sql
|
||||
CREATE TABLE embeddings (model_id bigint, item_id bigint, embedding vector, PRIMARY KEY (model_id, item_id));
|
||||
@@ -1129,7 +1127,7 @@ If compilation fails with `Cannot open include file: 'postgres.h': No such file
|
||||
|
||||
### Mismatched Architecture
|
||||
|
||||
If compilation fails with `error C2196: case value '4' already used`, make sure `vcvars64.bat` was called.
|
||||
If compilation fails with `error C2196: case value '4' already used`, make sure `vcvars64.bat` was called. Then run `nmake /F Makefile.win clean` and re-run the installation instructions.
|
||||
|
||||
### Missing Symbol
|
||||
|
||||
|
||||
@@ -8,9 +8,6 @@
|
||||
#error "Requires PostgreSQL 13+"
|
||||
#endif
|
||||
|
||||
/* Check architecture in first header */
|
||||
StaticAssertDecl(sizeof(Datum) == SIZEOF_DATUM, "Architecture mismatch");
|
||||
|
||||
extern uint64 (*BitHammingDistance) (uint32 bytes, unsigned char *ax, unsigned char *bx, uint64 distance);
|
||||
extern double (*BitJaccardDistance) (uint32 bytes, unsigned char *ax, unsigned char *bx, uint64 ab, uint64 aa, uint64 bb);
|
||||
|
||||
|
||||
13
src/hnsw.c
13
src/hnsw.c
@@ -259,6 +259,11 @@ hnswhandler(PG_FUNCTION_ARGS)
|
||||
amroutine->amoptsprocnum = 0;
|
||||
amroutine->amcanorder = false;
|
||||
amroutine->amcanorderbyop = true;
|
||||
#if PG_VERSION_NUM >= 180000
|
||||
amroutine->amcanhash = false;
|
||||
amroutine->amconsistentequality = false;
|
||||
amroutine->amconsistentordering = false;
|
||||
#endif
|
||||
amroutine->amcanbackward = false; /* can change direction mid-scan */
|
||||
amroutine->amcanunique = false;
|
||||
amroutine->amcanmulticol = false;
|
||||
@@ -291,6 +296,9 @@ hnswhandler(PG_FUNCTION_ARGS)
|
||||
amroutine->amvacuumcleanup = hnswvacuumcleanup;
|
||||
amroutine->amcanreturn = NULL;
|
||||
amroutine->amcostestimate = hnswcostestimate;
|
||||
#if PG_VERSION_NUM >= 180000
|
||||
amroutine->amgettreeheight = NULL;
|
||||
#endif
|
||||
amroutine->amoptions = hnswoptions;
|
||||
amroutine->amproperty = NULL; /* TODO AMPROP_DISTANCE_ORDERABLE */
|
||||
amroutine->ambuildphasename = hnswbuildphasename;
|
||||
@@ -311,5 +319,10 @@ hnswhandler(PG_FUNCTION_ARGS)
|
||||
amroutine->aminitparallelscan = NULL;
|
||||
amroutine->amparallelrescan = NULL;
|
||||
|
||||
#if PG_VERSION_NUM >= 180000
|
||||
amroutine->amtranslatestrategy = NULL;
|
||||
amroutine->amtranslatecmptype = NULL;
|
||||
#endif
|
||||
|
||||
PG_RETURN_POINTER(amroutine);
|
||||
}
|
||||
|
||||
@@ -805,6 +805,12 @@ HnswLoadUnvisitedFromDisk(HnswElement element, HnswUnvisited * unvisited, int *u
|
||||
if (!found)
|
||||
unvisited[(*unvisitedLength)++].indextid = *indextid;
|
||||
}
|
||||
|
||||
#ifdef USE_PREFETCH
|
||||
/* TODO limit by get_tablespace_io_concurrency */
|
||||
for (int i = 0; i < *unvisitedLength; i++)
|
||||
PrefetchBuffer(index, MAIN_FORKNUM, ItemPointerGetBlockNumber(&unvisited[i].indextid));
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -186,6 +186,11 @@ ivfflathandler(PG_FUNCTION_ARGS)
|
||||
amroutine->amoptsprocnum = 0;
|
||||
amroutine->amcanorder = false;
|
||||
amroutine->amcanorderbyop = true;
|
||||
#if PG_VERSION_NUM >= 180000
|
||||
amroutine->amcanhash = false;
|
||||
amroutine->amconsistentequality = false;
|
||||
amroutine->amconsistentordering = false;
|
||||
#endif
|
||||
amroutine->amcanbackward = false; /* can change direction mid-scan */
|
||||
amroutine->amcanunique = false;
|
||||
amroutine->amcanmulticol = false;
|
||||
@@ -218,6 +223,9 @@ ivfflathandler(PG_FUNCTION_ARGS)
|
||||
amroutine->amvacuumcleanup = ivfflatvacuumcleanup;
|
||||
amroutine->amcanreturn = NULL; /* tuple not included in heapsort */
|
||||
amroutine->amcostestimate = ivfflatcostestimate;
|
||||
#if PG_VERSION_NUM >= 180000
|
||||
amroutine->amgettreeheight = NULL;
|
||||
#endif
|
||||
amroutine->amoptions = ivfflatoptions;
|
||||
amroutine->amproperty = NULL; /* TODO AMPROP_DISTANCE_ORDERABLE */
|
||||
amroutine->ambuildphasename = ivfflatbuildphasename;
|
||||
@@ -238,5 +246,10 @@ ivfflathandler(PG_FUNCTION_ARGS)
|
||||
amroutine->aminitparallelscan = NULL;
|
||||
amroutine->amparallelrescan = NULL;
|
||||
|
||||
#if PG_VERSION_NUM >= 180000
|
||||
amroutine->amtranslatestrategy = NULL;
|
||||
amroutine->amtranslatecmptype = NULL;
|
||||
#endif
|
||||
|
||||
PG_RETURN_POINTER(amroutine);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user