特点:

  • id BIGINT
  • geo_point POINT(PostGIS)
  • stroke_when TIMESTAMPTZ(索引!)
  • stroke_when_second双精度

PostgeSQL 9.1,PostGIS 2.0。

1.查询:

SELECT ST_AsText(geo_point) 
FROM lightnings 
ORDER BY stroke_when DESC, stroke_when_second DESC 
LIMIT 1

总运行时间: 31100.911毫秒

EXPLAIN(分析,VERBOSE关闭,成本开启,BUFFERS开启):

Limit  (cost=169529.67..169529.67 rows=1 width=144) (actual time=31100.869..31100.869 rows=1 loops=1)
  Buffers: shared hit=3343 read=120342
  ->  Sort  (cost=169529.67..176079.48 rows=2619924 width=144) (actual time=31100.865..31100.865 rows=1 loops=1)
        Sort Key: stroke_when, stroke_when_second
        Sort Method: top-N heapsort  Memory: 17kB
        Buffers: shared hit=3343 read=120342
        ->  Seq Scan on lightnings  (cost=0.00..156430.05 rows=2619924 width=144) (actual time=1.589..29983.410 rows=2619924 loops=1)
              Buffers: shared hit=3339 read=120342

2.选择另一个字段:

SELECT id 
FROM lightnings 
ORDER BY stroke_when DESC, stroke_when_second DESC 
LIMIT 1

总运行时间: 2144.057毫秒

EXPLAIN(分析,VERBOSE关闭,成本开启,BUFFERS开启):

Limit  (cost=162979.86..162979.86 rows=1 width=24) (actual time=2144.013..2144.014 rows=1 loops=1)
  Buffers: shared hit=3513 read=120172
  ->  Sort  (cost=162979.86..169529.67 rows=2619924 width=24) (actual time=2144.011..2144.011 rows=1 loops=1)
        Sort Key: stroke_when, stroke_when_second
        Sort Method: top-N heapsort  Memory: 17kB
        Buffers: shared hit=3513 read=120172
        ->  Seq Scan on lightnings  (cost=0.00..149880.24 rows=2619924 width=24) (actual time=0.056..1464.904 rows=2619924 loops=1)
              Buffers: shared hit=3509 read=120172

3.正确优化:

SELECT id 
FROM lightnings 
ORDER BY stroke_when DESC 
LIMIT 1

总运行时间: 0.044毫秒

EXPLAIN(分析,VERBOSE关闭,成本开启,BUFFERS开启):

Limit  (cost=0.00..3.52 rows=1 width=16) (actual time=0.020..0.020 rows=1 loops=1)
  Buffers: shared hit=5
  ->  Index Scan Backward using lightnings_idx on lightnings  (cost=0.00..9233232.80 rows=2619924 width=16) (actual time=0.018..0.018 rows=1 loops=1)
        Buffers: shared hit=5

正如您所看到的,当SQL优化器使用索引时,查询是非常原始的,但有两个不同且非常不同的冲突:

  1. 即使优化器不使用索引,为什么使用As_Text(geo_point)而不是id需要花费更多时间? 结果只有一行!
  2. 在ORDER BY中显示未编制索引的字段时,无法使用一阶索引。 提到在实践中,每秒只有几行在DB中呈现。

当然,上面是一个简化的查询,从更复杂的结构中提取。 通常我按日期范围选择行,应用复杂的过滤器。

#1楼 票数:2 已采纳

PostgreSQL无法使用您的索引以前两个查询的所需顺序生成值。 当两个或多个行具有相同的store_when相同时,它们以任意顺序从索引扫描返回。 要确定行的正确顺序,需要进行二次排序。 因为PostgreSQL执行程序没有执行该次要排序的工具,所以它又回退到完全排序方法。

如果您经常需要使用该顺序查询表,则将当前索引替换为包含两个列的复合索引。

您可以将当前查询转换为仅在store_when的最大值上显式指定辅助排序的store_when

 SELECT ST_AsText(geo_point) FROM lightnings
 WHERE store_when = (SELECT max(store_when) FROM lightnings)
 ORDER BY stroke_when_second DESC LIMIT 1

#2楼 票数:1

第一步可能是:在{stroke_when,stroke_when_second}上创建一个复合索引

  ask by Alexander Palamarchuk translate from so

未解决问题?本站智能推荐:

1回复

Postgres按性能划分顺序

我正在使用分区postgres表遵循使用规则的文档 ,使用基于日期范围的分区方案(我的日期列是一个纪元整数) 问题是,选择具有分片列最大值的行的简单查询不使用索引: 首先,一些设置来强制postgres做我想做的事:SET constraint_exclusion = on; SET
1回复

PostgreSQL实型vs双重类型查询结果混乱

我有下表: 插入以下样本数据: 结果: 第二行查询结果为何是REAL类型的“ 2.1358” ?
2回复

如何让postgres避免对这个搜索分页查询进行双重顺序扫描?

架构 我有一堆帖子存储在一个表中(feed_items) 我有一个包含哪个用户 id 喜欢/不喜欢哪个 feed_item_id (feed_item_likes_dislikes) 的表 我有另一个表包含哪个用户 id 爱/激怒哪个 feed_item_id (feed_item_love_an
1回复

Postgresql列类型性能

所以,假设我需要创建一个表。 其中一列将包含一系列字符串,例如某人购买的水果。 现在,我需要执行查找,例如谁买了哪个水果,例如苹果等。现在,我可以为该列选择两种数据类型: json类型通过这种方法,该列将存储 JSON 对象并使用 POSTGRESQL json 运算符来检查水果是否存在。 字
2回复

PostgreSQLUUID类型的性能

我不是要重新启动UUID vs串行整数键辩论。 我知道任何一方都有有效的观点。 我在我的几个表中使用UUID作为主键。 列类型: "uuidKey" text NOT NULL 索引: CREATE UNIQUE INDEX grand_pkey ON grand USING b
1回复

Postgresql顺序扫描会降低5亿行的性能

我正在尝试使用Postgresql 11选择包含约5亿行的表的所有行。 在具有32个CPU核心和256GB RAM的VM以及具有高达200MB / s的SSD的读写速度下,这大约需要15分钟,这比我看到人们选择100万行数据时的预期要高得多。 〜1s( https://dba.stackex
1回复

多列顺序通过杀死postgresql性能,有什么办法解决?

我有一个非常简单的查询,我在一个大表(500k行)上运行以分页结果。 最初我使用的是这个查询,它确实非常快: 其说明分析显示出0.2ms的执行时间。 凉。 但是sas_rating列具有重复的整数值,当我分页浏览结果时(使用其他页面的偏移量),我意识到我正在获得重复的结果。 没问
1回复

避免在PostgreSQL和PostGIS中进行双重计算以提高性能

带有双重计算的 PostgreSQL / PostGIS 示例: 在这种情况下,是否有一些简单的方法可以避免对相同值进行双重(多次)计算? 我知道我可以像这样实现它: 有没有什么简单的方法可以在没有子查询等的情况下实现它? 像这样简单的事情: