假设我有一个包含字段A和的表B。我在A+上进行常规查询B,所以我在 上创建了一个复合索引(A,B)。A复合索引是否也会对查询进行全面优化?
此外,我在 上创建了一个索引A,但 Postgres 仍然只使用复合索引来查询A。如果前面的答案是肯定的,我想这并不重要,但是为什么它默认选择复合索引,如果单个A索引可用?
根据PostgreSQL 的文档,VARCHAR,VARCHAR(n)和之间没有性能差异TEXT。
我应该为名称或地址列添加任意长度限制吗?
编辑:不是欺骗:
我知道这种CHAR类型是过去的遗物,我不仅对性能感兴趣,而且对其他优缺点感兴趣,例如 Erwin 在他惊人的回答中所述。
我们的系统写入了大量数据(一种大数据系统)。写入性能足以满足我们的需求,但读取性能真的太慢了。
我们所有表的主键(约束)结构都相似:
timestamp(Timestamp) ; index(smallint) ; key(integer).
Run Code Online (Sandbox Code Playgroud)
一个表可以有数百万行,甚至数十亿行,而一个读请求通常是针对特定时间段(时间戳/索引)和标记的。查询返回大约 20 万行是很常见的。目前,我们每秒可以读取大约 15k 行,但我们需要快 10 倍。这是可能的,如果是,如何?
注意: PostgreSQL 是和我们的软件一起打包的,所以不同客户端的硬件是不一样的。
它是一个用于测试的虚拟机。VM 的主机是具有 24.0 GB RAM 的 Windows Server 2008 R2 x64。
Server 2008 R2 x64
2.00 GB of memory
Intel Xeon W3520 @ 2.67GHz (2 cores)
Run Code Online (Sandbox Code Playgroud)
postgresql.conf 优化shared_buffers = 512MB (default: 32MB)
effective_cache_size = 1024MB (default: 128MB)
checkpoint_segment = 32 (default: 3)
checkpoint_completion_target = 0.9 (default: 0.5)
default_statistics_target = 1000 (default: 100)
work_mem = 100MB (default: 1MB)
maintainance_work_mem = 256MB …Run Code Online (Sandbox Code Playgroud) 我有一个有 50K 行的表。它实际上是一个 PostGIS 表。
查询有 4 个部分(1 个强制)(3 个可选)
我预计大约有 100 - 4,000 行返回
如果我在表上创建复合索引,我应该先使用哪一列。细粒度的可能是位置(数据分布在世界各地)。我目前将其作为 GIST 索引。
其他索引将是 BTREE。
我的直觉是使用细粒度的,当然最后。例如,只有大约 12 种文件类型,因此对于索引来说这将是非常大的存储桶。
PostgreSQL 和 PostGIS 大师(了解系统内部结构的人)怎么说?
更新:
让我尖锐地回答这个问题。
请告诉我这些假设是否有误。(我对复合索引的想法很陌生)