Skip to content

Commit ae9c87c

Browse files
committed
Avoid creating a new page for every insert
1 parent 8596d56 commit ae9c87c

File tree

4 files changed

+35
-4
lines changed

4 files changed

+35
-4
lines changed

pgvectorscale/src/access_method/build.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::time::Instant;
22

3-
use pgrx::pg_sys::{pgstat_progress_update_param, AsPgCStr};
3+
use pgrx::pg_sys::{pgstat_progress_update_param, AsPgCStr, BlockNumber};
44
use pgrx::*;
55

66
use crate::access_method::graph::Graph;
@@ -183,14 +183,15 @@ unsafe fn insert_storage<S: Storage>(
183183
meta_page: &mut MetaPage,
184184
stats: &mut InsertStats,
185185
) {
186-
let mut tape = Tape::new(&index_relation, S::page_type());
186+
let mut tape = Tape::from_meta_page(index_relation, S::page_type(), meta_page);
187187
let index_pointer = storage.create_node(
188188
vector.to_index_slice(),
189189
heap_pointer,
190190
&meta_page,
191191
&mut tape,
192192
stats,
193193
);
194+
tape.save_block_number(meta_page);
194195

195196
let mut graph = Graph::new(GraphNeighborStore::Disk, meta_page);
196197
graph.insert(&index_relation, index_pointer, vector, storage, stats)

pgvectorscale/src/access_method/meta_page.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use pgrx::pg_sys::{BufferGetBlockNumber, InvalidBlockNumber, InvalidOffsetNumber};
1+
use pgrx::pg_sys::{BlockNumber, BufferGetBlockNumber, InvalidBlockNumber, InvalidOffsetNumber};
22
use pgrx::*;
33
use pgvectorscale_derive::{Readable, Writeable};
44
use rkyv::{Archive, Deserialize, Serialize};
@@ -76,6 +76,7 @@ impl MetaPageV1 {
7676
max_alpha: self.max_alpha,
7777
init_ids: ItemPointer::new(self.init_ids_block_number, self.init_ids_offset),
7878
quantizer_metadata: ItemPointer::new(InvalidBlockNumber, InvalidOffsetNumber),
79+
tape_block_number: BlockNumber::MAX,
7980
}
8081
}
8182
}
@@ -132,6 +133,7 @@ pub struct MetaPage {
132133
max_alpha: f64,
133134
init_ids: ItemPointer,
134135
quantizer_metadata: ItemPointer,
136+
tape_block_number: BlockNumber,
135137
}
136138

137139
impl MetaPage {
@@ -207,6 +209,13 @@ impl MetaPage {
207209
}
208210
}
209211

212+
pub fn get_tape_block_number(&self) -> BlockNumber {
213+
self.tape_block_number
214+
}
215+
pub fn set_tape_block_number(&mut self, block_number: BlockNumber) {
216+
self.tape_block_number = block_number;
217+
}
218+
210219
fn calculate_num_neighbors(
211220
num_dimensions: u32,
212221
num_bits_per_dimension: u8,
@@ -285,6 +294,7 @@ impl MetaPage {
285294
max_alpha: (*opt).max_alpha,
286295
init_ids: ItemPointer::new(InvalidBlockNumber, InvalidOffsetNumber),
287296
quantizer_metadata: ItemPointer::new(InvalidBlockNumber, InvalidOffsetNumber),
297+
tape_block_number: BlockNumber::MAX,
288298
};
289299
let page = page::WritablePage::new(index, crate::util::page::PageType::Meta);
290300
meta.write_to_page(page);

pgvectorscale/src/access_method/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod debugging;
55
mod graph;
66
mod graph_neighbor_store;
77
pub mod guc;
8-
mod meta_page;
8+
pub mod meta_page;
99
mod neighbor_with_distance;
1010
pub mod options;
1111
pub mod pg_vector;

pgvectorscale/src/util/tape.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Tape provides a simple infinite-tape-writing abstraction over postgres pages.
22
33
use super::page::{PageType, WritablePage};
4+
use crate::access_method::meta_page::MetaPage;
45
use pgrx::{
56
pg_sys::{BlockNumber, BLCKSZ},
67
*,
@@ -24,6 +25,25 @@ impl<'a> Tape<'a> {
2425
}
2526
}
2627

28+
pub unsafe fn from_meta_page(
29+
index: &'a PgRelation,
30+
page_type: PageType,
31+
meta_page: &MetaPage,
32+
) -> Self {
33+
match meta_page.get_tape_block_number() {
34+
BlockNumber::MAX => Self::new(index, page_type),
35+
current => Self {
36+
index,
37+
page_type,
38+
current,
39+
},
40+
}
41+
}
42+
43+
pub unsafe fn save_block_number(&self, meta_page: &mut MetaPage) {
44+
meta_page.set_tape_block_number(self.current);
45+
}
46+
2747
pub unsafe fn write(&mut self, data: &[u8]) -> super::ItemPointer {
2848
let size = data.len();
2949
assert!(size < BLCKSZ as usize);

0 commit comments

Comments
 (0)