PostgreSQL中不稳定的索引查询性能
需要有关PostgreSQL中查询性能的帮助。这似乎与索引有关 此查询:PostgreSQL中不稳定的索引查询性能,sql,performance,postgresql,indexing,Sql,Performance,Postgresql,Indexing,需要有关PostgreSQL中查询性能的帮助。这似乎与索引有关 此查询: 根据类型进行筛选 按时间戳排序,升序: 从表中选择*,其中type='some\u type'按时间戳限制排序20 索引: CREATE INDEX the_table_timestamp_index ON the_table(timestamp); CREATE INDEX the_table_type_index ON the_table(type); type字段的值仅为11个不同字符串中的一个。 问题在
- 根据
类型进行筛选
- 按
排序,升序:时间戳
从表中选择*,其中type='some\u type'按时间戳限制排序20
索引:
CREATE INDEX the_table_timestamp_index ON the_table(timestamp);
CREATE INDEX the_table_type_index ON the_table(type);
type
字段的值仅为11个不同字符串中的一个。问题在于,查询似乎是在O(logn)时间内执行的,大多数时间只需要几毫秒,除了一些
type
值需要几分钟才能运行
在这些示例查询中,第一个查询只需几毫秒即可运行,而第二个查询则需要30分钟以上:
SELECT * FROM the_table WHERE type = 'goq' ORDER BY timestamp LIMIT 20
SELECT * FROM the_table WHERE type = 'csp' ORDER BY timestamp LIMIT 20
我怀疑,大约有90%的把握,我们拥有的指数不是正确的。在阅读之后,我认为我们最需要的是一个复合索引,在类型
和时间戳
上
我运行的查询计划如下所示:
非常感谢你的帮助!任何指点都将非常感激 索引可用于
where
子句或order by
子句。使用索引表格(类型、时间戳)
,则可以对两者使用相同的索引
我的猜测是,Postgres正在根据收集的统计数据决定使用哪个索引。当它使用where的索引,然后尝试排序时,会得到非常糟糕的性能
这只是一个猜测,但是创建上面的索引是值得的,以查看这是否解决了性能问题。解释输出都使用时间戳索引。这可能是因为类型列的基数太低,所以对该列上的索引进行扫描与表扫描一样昂贵 要创建的复合索引应为:
create index comp_index on the_table ("timestamp", type)
按这个顺序 索引的大小是多少?数据集的大小呢?太棒了!所以索引中列的顺序不同?@JuanCarlosCoto。事实上,这个顺序确实起到了作用。通过先放置
时间戳
,引擎无法使用where
子句的索引。各种类型将分散在整个索引中。