PostgreSQL-用于全文生成列的Alter列

PostgreSQL-用于全文生成列的Alter列,postgresql,Postgresql,在PostgreSQL 13上,我有一个表定义如下: 创建表格我的表格( id serial8主键, 标题varchar(50), 描述varchar(512), 法语(u vector)(u text tsvector)生成时始终存储为(to)tsvector(法语),coalesce(标题),| | | | | | coales ); 使用GIN(法语向量文本)在my_表上创建索引IDX_全文; 它很好用。但是,当我试图更改用于生成向量的列时,如下所示 alter table my_tab

在PostgreSQL 13上,我有一个表定义如下:

创建表格我的表格(
id serial8主键,
标题varchar(50),
描述varchar(512),
法语(u vector)(u text tsvector)生成时始终存储为(to)tsvector(法语),coalesce(标题),| | | | | | coales
);
使用GIN(法语向量文本)在my_表上创建索引IDX_全文;
它很好用。但是,当我试图更改用于生成向量的列时,如下所示

alter table my_table
更改列标题类型varchar(100);
我得到一个错误,告诉我我不能改变用于计算另一列的列,这是公平的。我通过删除带有索引的向量列,修改标题列,然后重新创建列和索引来实现

alter table my_table
删除列法语向量文本;
改变我的桌子
更改列标题
varchar型(100);
改变我的桌子
添加列french_vector_text tsvector,生成时始终存储为(到_tsvector('french',coalesce(title.))| |'''.| | coalesce(description'));
使用GIN(法语向量文本)在my_表上创建索引IDX_全文;
同样,它工作得很好,但实际上,该列是7列的聚合,有些列包含相当大的文本,表中可能包含一万条记录。所以手术需要一段时间才能完成

即使改变模式不是日常操作,我想知道是否有更有效的解决方案不需要删除列并完全重新创建索引

我考虑使用触发器,但我宁愿保留生成的列。因此,我尝试创建一个
不可变的
函数:

create function my_french_vector(text_to_transform varchar)将tsvector返回为$$
开始
返回到_-tsvector(“法语”,文本到_的转换);
结束
$$语言plpgsql
不变的
并使用它而不是普通的
来_tsvector
。但是很明显,它也不起作用,因为列仍然被引用


至于我的问题,有没有一种方法可以改变生成值中使用的列,而不必删除它并在之后重新创建整个内容?

我根本不会使用生成的列,而是在表达式上定义索引:

CREATE INDEX french_text_idx ON my_table
   (to_tsvector('french', coalesce(title, '') || ' ' || coalesce(description, '')));
然后将查询修改为

... WHERE to_tsvector('french', coalesce(title, '') || ' ' || coalesce(description, ''))
             @@ to_tsquery('french', 'whatever')
它将使用索引

添加新列时,创建包含新列的新索引(
并发
),然后更改应用程序中的查询,然后删除旧索引


如果您不想更改应用程序中的查询,请在包含索引表达式的计算列的表上定义一个视图,然后您所要做的就是创建或替换视图。

我没有考虑该视图,我将研究它,谢谢。只是一个问题,我最初使用生成的列,因为我了解到它们更快,因为在请求时调用
到_tsvector
没有开销。查看+索引不是会更慢吗?这取决于您有多少搜索结果以及PostgreSQL选择的索引扫描类型:如果它必须“重新检查”很多行,它可能会稍微慢一点。另一方面,还需要在插入时计算存储列,它会占用空间。您可以进行测试,但我认为性能差异不会很大。