相关疑难解决方法(0)

复合索引是否也适用于第一个字段的查询?

假设我有一个包含字段A和的表B。我在A+上进行常规查询B,所以我在 上创建了一个复合索引(A,B)A复合索引是否也会对查询进行全面优化?

此外,我在 上创建了一个索引A,但 Postgres 仍然只使用复合索引来查询A。如果前面的答案是肯定的,我想这并不重要,但是为什么它默认选择复合索引,如果单个A索引可用?

postgresql performance index database-design index-tuning

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

当所有值都是 36 个字符时,使用 char 和 varchar 进行索引查找会明显更快吗

我有一个旧模式(免责声明!),它使用基于哈希生成的 id 作为所有表的主键(有很多)。这种 id 的一个例子是:

922475bb-ad93-43ee-9487-d2671b886479
Run Code Online (Sandbox Code Playgroud)

改变这种方法是不可能的,但是索引访问的性能很差。撇开这可能的无数原因不谈,我注意到有一件事似乎不太理想 - 尽管所有许多表中的所有 id 值的长度都正好是 36 个字符,但列类型是varchar(36)而不是 char(36)

将列类型更改为固定长度是否会char(36)提供任何显着的索引性能优势,除了每个索引页的条目数量增加很小等之外?

即在处理固定长度类型时 postgres 的执行速度是否比处理可变长度类型快得多?

请不要提及微小的存储节省 - 与对列进行更改所需的手术相比,这无关紧要。

postgresql performance index varchar

38
推荐指数
1
解决办法
1万
查看次数

多列索引和性能

我有一个带有多列索引的表,我怀疑索引的正确排序以获得最大查询性能。

场景:

  • PostgreSQL 8.4,大约有一百万行的表

  • c1列中的值可以有大约100 个不同的值。我们可以假设这些值是均匀分布的,因此每个可能的值大约有 10000 行。

  • c2可以有1000 个不同的值。对于每个可能的值,我们有 1000 行。

搜索数据时,条件始终包含这两列的值,因此该表具有组合 c1 和 c2 的多列索引。如果您的查询仅使用一列进行过滤,我已经阅读了正确排序多列索引中的列的重要性。在我们的场景中,情况并非如此。

我的问题是这个:

鉴于其中一个过滤器选择的数据集要小得多,如果第一个索引是最具选择性的索引(允许更小的数据集),我是否可以提高性能?在我看到参考文章中的图形之前,我从未考虑过这个问题:

在此处输入图片说明

图片取自有关多列索引的参考文章。

查询使用两列中的值进行过滤。我没有仅使用一列进行过滤的查询。他们都是:WHERE c1=@ParameterA AND c2=@ParameterB。还有这样的条件:WHERE c1 = "abc" AND c2 LIKE "ab%"

postgresql index index-tuning

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

未使用但影响查询的索引

我有一个 PostgreSQL 9.3 表,其中包含一些数字和一些附加数据:

CREATE TABLE mytable (
    myid BIGINT,
    somedata BYTEA
)
Run Code Online (Sandbox Code Playgroud)

该表目前有大约 10M 条记录,占用 1GB 磁盘空间。myid不连续。

我想计算 100000 个连续数字的每个块中有多少行:

SELECT myid/100000 AS block, count(*) AS total FROM mytable GROUP BY myid/100000;
Run Code Online (Sandbox Code Playgroud)

这将返回大约 3500 行。

我注意到某个索引的存在显着加快了这个查询,即使查询计划根本没有提到它。没有索引的查询计划:

db=> EXPLAIN (ANALYZE TRUE, VERBOSE TRUE) SELECT myid/100000 AS block, count(*) AS total FROM mytable GROUP BY myid/100000;
                                                               QUERY PLAN                                                               
----------------------------------------------------------------------------------------------------------------------------------------
 GroupAggregate  (cost=1636639.92..1709958.65 rows=496942 width=8) (actual time=6783.763..8888.841 rows=3460 loops=1)
   Output: ((myid / 100000)), count(*)
   ->  Sort  (cost=1636639.92..1659008.91 rows=8947594 width=8) (actual time=6783.752..8005.831 …
Run Code Online (Sandbox Code Playgroud)

postgresql index execution-plan count index-tuning

9
推荐指数
2
解决办法
1014
查看次数

在具有现有数据的表上创建时未使用 PostgreSQL 部分索引

在 PostgreSQL 9.3 中,我试图在一个很少使用的(占总记录的 0.00001%)布尔列上创建一个有效的索引。为此,我在 SO 上发现了这篇文章: https //stackoverflow.com/a/12026593/808921

我正在尝试利用 Erwin Brandstetter 推荐的 PostgreSQL 的“部分索引”功能。我已经有一个包含几百万条记录的表,我想将索引添加到该表中,如下所示:

CREATE INDEX schema_defs_deprovision ON schema_defs (deprovision) 
WHERE deprovision = 0;
Run Code Online (Sandbox Code Playgroud)

(绝大多数记录都会有 deprovision = 1

问题是,当我尝试将此索引与最简单的查询一起使用时,PostgreSQL 就好像它不存在一样:

explain select * from schema_defs where deprovision = 0;

Seq Scan on schema_defs (cost=0.00..1.05 rows=1 width=278)
Filter: (deprovision = 0)
Run Code Online (Sandbox Code Playgroud)

真正奇怪的是,我发现如果这个索引是在表中有数据之前创建的,那么它确实可以正常工作。不相信我?以下是一些证明这一点的 SQL Fiddle 条目:

插入后创建的部分索引(索引不起作用)

插入前创建的部分索引(索引正常工作)

在这两个中,只需展开“查看执行计划”链接即可查看我在说什么。

所以,我的问题是 - 我必须做什么才能让 PostgreSQL 在创建索引之前开始在其中包含数据的表上使用部分索引?

顺便说一句,我也是 SQL Fiddle 的开发人员,这个问题与我正在为此进行的一项新开发工作有关。

postgresql index statistics execution-plan

7
推荐指数
1
解决办法
964
查看次数