2012-04-04 132 views
2

我是PostgreSQL的新手,特别是其性能调优方面。基本上我们有通过查询3个整数值来访问的数据:segmentSize(范围1 ... 10),segmentX(范围+/- 100,000),segmentY(范围+/- 100,000)。PostgreSQL单列索引与多列索引优化SELECT性能

一个前瞻性的考虑:当数据量增长时,可能会将数据分割成多个表格,每个segmentSize和/或segmentX和segmentY的连续范围。

目前的选择:我有一个直接使用键(segmentSize,segmentX,segmentY)或 - 为了获得性能的架构选择 - 在PostgreSQL之外创建一个合成关键字,将segmentX,segmentY合并为一个整数价值成为关键(或者不太可能,所有三个(segmentSize,segmentX,segmentY)。

问题:假设我们不太在意从segmentX派生出这个“组合键”的成本,segmentY发生了在Postgress之外,并且由于我们并不是专门在每行数据的字节顺序上节省空间(除非它使性能有所不同), ....将会有任何可测量或有意义的性能增益从查询罪gle范围segmentX * segmentY的int值,而不是查询segmentX和segmentY的两个单独int值的组合。

很多很多,谢谢。请随意添加任何扩展适用数据和索引策略的链接,以最大限度地提高SELECT /读取性能。

+1

在您的查询中使用EXPLAIN和EXPLAIN ANALYZE查看和衡量发生了什么以及哪些效果最好。 – 2012-04-04 18:00:14

+0

谢谢你,弗兰克! – SashaK 2012-04-04 18:22:14

+0

首先:*自然*主键是什么?第二:您的典型用法是什么:在X或Y上或者{X,Y}或{Y,X}上进行范围查询?第三:查询中的关键字组是否与“自然”PK中的不同?它与插入操作中的一组关键字不同吗?第四:从三个关键字段的集合中:是否有可能配对的候选关键字?第五:请添加关键钥匙的含义的描述。 “segment_id”对我们大多数人来说并不是很有帮助。 – wildplasser 2012-04-04 18:31:45

回答

1

将两个(或三个)列组合成一个值的密钥的性能优势可能非常小。实际上,伤害表现为一些用法;如果这些值在其他表中有意义,则需要通过综合关键字“导航”,以防止计划被考虑,这可能会更快。有一个可用的自然键时使用合成键往往会归入“不成熟优化”的标题之下,并伴有所有相关风险 - 包括很可能会使事情变得更慢。