小编Dr.*_*YSG的帖子

PostgreSQL 复合索引中的列顺序(和查询顺序)

我有一个有 50K 行的表。它实际上是一个 PostGIS 表。

查询有 4 个部分(1 个强制)(3 个可选)

  1. 具有 4 lat,long 的交叉框(地理矩形)(我使用 st_intersects)[强制]
  2. 日期字段上的日期范围(最小值、最大值)
  3. 当前使用 IN( .....) 的文件类型(一组最多 8 个文本值),但如果需要,我可以将其设为临时表。我看到很多人不喜欢IN。
  4. 国家(一个文本值)。

我预计大约有 100 - 4,000 行返回

如果我在表上创建复合索引,我应该先使用哪一列。细粒度的可能是位置(数据分布在世界各地)。我目前将其作为 GIST 索引。

其他索引将是 BTREE。

我的直觉是使用细粒度的,当然最后。例如,只有大约 12 种文件类型,因此对于索引来说这将是非常大的存储桶。

PostgreSQL 和 PostGIS 大师(了解系统内部结构的人)怎么说?


更新:

让我尖锐地回答这个问题。

  1. 我不希望任何人不得不做我应该做的工作。我太尊重你的时间了。所以我将在稍后进行解释分析。
  2. 我所寻找的只是一些指示、技巧和指导方针。
  3. 我读了这篇很棒的小帖子:https : //devcenter.heroku.com/articles/postgresql-indexes#managing-and-maintaining-indexes关于索引
  4. 我通常做的是创建 4 个单独的索引(地理框、国家/地区名称、文件类型和日期),但想看看复合查询会做什么。

请告诉我这些假设是否有误。(我对复合索引的想法很陌生)

  1. 顺序很重要。选择最能减少行的索引作为第一个索引(在我的情况下,位置(地理)是一个简单的多边形或多多边形会做得最好)。
  2. 有时查询会跳过索引。但是,如果我使用键 (#1, #2, #3, #4) 创建一个复合查询,那么即使用户创建了要求 #1, #3 的内容,规划器仍将使用单个复合查询,因为他们订购被维护。
  3. 通常我会创建三个 BTREE 查询和一个 GIST(用于地理类型)。PostGIS 不支持从多个索引类型中创建复合。所以我将不得不使用 GIST 复合索引。但这不应该伤害事情。
  4. 如果我确实创建了一些额外的复合或单值索引,那么规划器就足够聪明,可以选择最聪明的一个......
  5. Country Name 可以有大约 250 个不同的值,并且显然与位置 (geobox) 密切相关,但是如果减少行大小的下一个最佳索引是 file_type,我接下来应该使用它。我不希望用户经常在他们的查询集中使用国家或日期。
  6. 我不必担心创建 …

postgresql postgis

14
推荐指数
1
解决办法
8564
查看次数

PostgreSQL/PostGIS 9.6 破坏了我的复合索引

在 PostgreSQL 9.2 中,我可以轻松创建具有地理 (postGIS) 类型和整数作为复合索引的索引。但是现在(9.6)它抱怨创建索引,我不明白它提供的提示:

列和数据都已正确创建,Postgres 抱怨创建索引。

ERROR: data type integer has no default operator class for access method "gist" 
HINT: You must specify an operator class for the index 
      or define a default operator class for the data type. 
********** Error**********  
ERROR: data type integer has no default operator class for access method "gist" 
SQL state: 42704 
Hint: You must specify an operator class for the index 
      or define a default operator class for the data type.
Run Code Online (Sandbox Code Playgroud)

模式定义如下: …

postgresql postgis postgresql-9.6

8
推荐指数
1
解决办法
847
查看次数

4300 万张 PostgreSQL 表上的复合索引

这个问题与我之前问过的问题有关:PostgreSQL 中复合索引中的列顺序(和查询顺序)

我想我可以在这里尖锐和限制我的问题,而不是超载这个问题。鉴于以下查询(和 EXPLAIN ANALYZE),我正在创建的复合索引有帮助吗?

第一个查询仅使用简单索引(大纲上的 GIST)和(pid 上的 BTREE)运行。

查询是:

EXPLAIN ANALYZE SELECT DISTINCT ON (path) oid, pid, product_name, type, path, size 
FROM portal.inventory AS inv 
WHERE ST_Intersects(st_geogfromtext('SRID=4326;POLYGON((21.51947021484375 51.55059814453125, 18.9129638671875 51.55059814453125, 18.9129638671875 48.8287353515625, 21.51947021484375 48.8287353515625, 21.51947021484375 51.55059814453125))'), inv.outline) 
AND (inv.pid in (20010,20046)) 
Run Code Online (Sandbox Code Playgroud)

——

结果如下(速度更快,但也许这只是因为数据库是热的)。

"Unique  (cost=581.76..581.76 rows=1 width=89) (actual time=110.436..110.655 rows=249 loops=1)"
"  ->  Sort  (cost=581.76..581.76 rows=1 width=89) (actual time=110.434..110.477 rows=1377 loops=1)"
"        Sort Key: path"
"        Sort Method: quicksort  Memory: 242kB"
"        ->  Bitmap Heap Scan on inventory …
Run Code Online (Sandbox Code Playgroud)

postgresql index index-tuning

4
推荐指数
1
解决办法
535
查看次数

来自 Postgres 更新监视器的连接超时错误 (postgres 9.6)

我在 Windows 10 上运行 PostgreSQL 9.6

它似乎有一个更新监视器,它不使用有关 Windows 委托代理的任何信息(我们有一个公司代理)。它也不查看环境变量 HTTP_PROXY 或 HTTPS_PROXY(我已将其设置为通过 CNTLM 为我们的公司防火墙添加凭据)。这对于 NPM 和 GIT 等需要通过我们的传出防火墙的程序很有用。

因此,我每 10 或几分钟收到以下消息,作为从名为的程序弹出的消息:

"D:\Program Files (x86)\postgresql\updatemonitor\bin\UpdManager.exe" --execute  "D:\Program Files\PostgreSQL\9.6\bin\stackbuilder.exe"
Run Code Online (Sandbox Code Playgroud)

该消息非常具有欺骗性,但我找到了该程序,它是上面列出的程序。

在此处输入图片说明

postgresql enterprisedb

4
推荐指数
2
解决办法
4860
查看次数