sql - 批量插入表时优化索引更新速度

标签 sql postgresql indexing postgresql-9.1

当向一个表中插入大量数据时(从另一个表中插入,无特定顺序),您如何优化多列索引以使索引以最快的方式更新?

假设索引从未在任何SELECTDELETEUPDATE 查询中使用。* 还假设列的不同计数为如下(例如):

COLUMN | DISTINCT COUNT
col1   |            634
col2   |          9,923
col3   |          2,357
col4   |              3

* 选择数据时不使用索引的原因是这是主键索引或唯一约束索引。索引已就位,因此违反约束的插入应该会失败。

我读到,最有选择性的栏目应该排在第一位。那是正确的吗,索引是不是要按如下方式创建?

(col2, col3, col1, col4)

如果那是错误的,您如何确定索引中列的最佳顺序,该索引只会将批量 INSERT 插入相应的表中?目标是在批量 INSERT 期间加快索引的更新。

最佳答案

最快的方法是DROP INDEX,然后进行批量插入,并在插入完成后CREATE INDEX

索引的正确结构与列中值的分布没有太大关系,但与检索策略有关,大概仅适用于 UPDATEDELETE ,然后特别是当您对索引的某些但并非全部总是所有列进行部分过滤时。那些更频繁的过滤器应该在你的索引列中排在第一位。但如果是这种情况,您可能想要更彻底地重新考虑您的索引策略:最好有两个或更多索引来匹配您的典型检索策略。

忽略您对无知的呼吁:您为什么不将索引应用于 SELECT 语句?索引用于从表中选择数据子集,无论是SELECT 还是限定的UPDATEDELETE。在这三种操作中使用索引在功能上没有区别。

OP 评论后的附录:索引可用于许多目的,但它们的维护相对昂贵,随着表大小的增加,“相对”很快就会变成“不可能”。在您的情况下,您必须将源表中的每条记录与目标表中的每条记录或 O(m*n) 顺序进行比较。这对于大尺寸的表是行不通的,即使有索引也是如此。最好的办法是删除索引,进行插入,创建一个不唯一的索引,查找并删除所有重复项,删除索引,最后创建一个新的唯一索引>.

关于sql - 批量插入表时优化索引更新速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22574532/

相关文章:

sql - 如何改进这个 Postgres 查询?

sql - PostgreSQL - 检测系列中的模式

arrays - 查找分组在数组中的特定零点 - matlab

Mysql 多列全文索引 & "AND operator"

php - 没有while循环的多选查询MySQL

c# - 使用 C# 插入到 postgresql 表中

SQL Server 查询重复列的最新值

Python:3D 列表的索引错误

java - 使用 Hibernate 删除父行时如何删除所有子行?

php - 部署一个小型 PHP + MySQL 服务