PREPARE 语句在几次调用后决定不使用索引,即使它更慢

问题描述 投票:0回答:0

我已经为产品标题创建了一个索引。 使用杜松子酒创建产品索引 products_title_trgm_idx(title gin_trgm_ops)

我尝试创建一个 prepare 语句,当我使用相同的搜索值对其执行多个调用时,它使用我的索引进行前 4 个查询,它的速度非常快,大约 20 毫秒。但是在第五次它只是随机决定不使用使其执行 3-4s 的索引。为什么会这样?

PREPARE my_test AS SELECT "products"."id","products"."active","products"."title","products"."subtitle","products"."description","products". isbn”,“产品”,“ean”,“产品”,“bznr”,“产品”,“cover_p 图片”,“产品”,“出版日期”,“产品”,“版本”,“产品”,“出版商”,“产品”,“库存”,“产品”,“交货时间”,“产品”,“销售价格” “产品”、“宽度”、“产品”、“高度”、“产品”、“长度” h","products"."weight" FROM "products" WHERE products.title ILIKE $1 LIMIT 10; 我创建了这个准备语句然后做了 EXECUTE my_test('%Warum Frauen alles besser wissen - und trotzdem alles falsch machen%'); 连续 5 次,前 4 次它使用索引并且非常快,但是在第五次和之后的几次它使用 seq 扫描,这非常慢?为什么要这样做?我尝试禁用 seq 扫描,它会与索引一起执行并始终在 20 毫秒内执行它,但我知道禁用它不是一个好主意。

database postgresql go indexing go-gorm
© www.soinside.com 2019 - 2024. All rights reserved.