我有一个列类型为text
. 来自SQL Server背景,这是否等同于(n)varchar(max)
类型?
我提出这个问题的具体示例/原因是,我有一个表,其中包含一个类型的列text
,我想在其中存储唯一值。该表根据常规 CSV 导入进行更新,这意味着对于 CSV 中的每一行,text
都会检查该列是否存在现有条目(CSV 中的列值),如果没有找到,则将该值插入到表中.
我的理解是,这可能意味着将数千个(或数十万个)text
值与其他text
值进行比较。我想这是非常无能的。是这样吗?
是的,
text
(大致)相当于varchar(max)
比较文本值的效率不亚于比较
varchar
Postgres 中的值,因为它们在底层是完全相同的。所以比较的效率与值的长度有关。我预计这不会比您varchar(max)
在 SQL Server 中使用的当前实现慢。如果要对列强制执行唯一性,请在其上创建唯一索引。然后,您可以使用
insert ... on conflict do nothing
有效地插入新值并同时验证它们是唯一的。但是:索引条目的允许长度存在技术限制,大约为 2700 字节。你没有提到你的价值观有多长,但索引可能不适合你。
还要考虑这个答案https://dba.stackexchange.com/a/69164
对此没有明确的答案。它将成为瓶颈,除非其他东西需要足够的时间成为瓶颈。
如果加载过程是写入密集型的,那么写入的开销通常会成为瓶颈。但是,如果几乎每个 csv 行都未通过唯一性检查,因此不会导致写入,则情况并非如此。
如果几乎每个 csv 行都失败,并且如果您在 text 列上有一个索引,那么搜索索引的一般开销(从一个页面到另一个页面,同时从根下降到叶子,特别是如果整个路径还没有在内存中)可能是瓶颈。
如果您没有索引,因此需要针对每个建议的插入对表进行全扫描,那么文本相等操作很可能成为瓶颈。如果您的字符串具有较长的公共前缀并且仅在字符串末尾的字符不同,则尤其如此。