我有一个缓慢的删除查询。正如建议的here,当我添加索引时,我得到了更好的结果。除了这个场景,我不需要这个索引,所以我做的是:1.添加索引。1.已删除行。1.掉了索引。有没有可能在一个事务中完成这3个步骤,而根本不提交这个索引,但仍然能够在delete查询中使用它?
delete
xesrikrc1#
是的,您可以在事务中创建索引(除非您使用CONCURRENTLY)。但是,这是一个坏主意:CREATE INDEX锁定表,防止所有数据修改,并且该锁定将一直保持到您的事务结束。因此,您将对并发SQL语句的影响比使用一个额外的索引更大。
CONCURRENTLY
CREATE INDEX
2uluyalo2#
创建索引,运行查询,然后删除索引,这样做对您自己没有任何好处。CREATE INDEX的计算和I/O工作负载非常重要。而且,维护索引的开销是适度的,除非在运行删除查询之间对生产中的表进行了大量更改(INSERT、UPDATE和DELETE)。而且存储开销很可能是相当合理的。HDD / SSD存储很便宜,而且越来越便宜。使用索引不会影响SELECT查询的性能,并且可能有助于某些查询。因此,虽然您可以创建索引,运行查询,并将索引放入事务中,但您几乎肯定最好创建索引并将其留在原地。
2条答案
按热度按时间xesrikrc1#
是的,您可以在事务中创建索引(除非您使用
CONCURRENTLY
)。但是,这是一个坏主意:CREATE INDEX
锁定表,防止所有数据修改,并且该锁定将一直保持到您的事务结束。因此,您将对并发SQL语句的影响比使用一个额外的索引更大。2uluyalo2#
创建索引,运行查询,然后删除索引,这样做对您自己没有任何好处。
CREATE INDEX的计算和I/O工作负载非常重要。而且,维护索引的开销是适度的,除非在运行删除查询之间对生产中的表进行了大量更改(INSERT、UPDATE和DELETE)。而且存储开销很可能是相当合理的。HDD / SSD存储很便宜,而且越来越便宜。使用索引不会影响SELECT查询的性能,并且可能有助于某些查询。
因此,虽然您可以创建索引,运行查询,并将索引放入事务中,但您几乎肯定最好创建索引并将其留在原地。