假设我有一个包含字段A
和的表B
。我在A
+上进行常规查询B
,所以我在 上创建了一个复合索引(A,B)
。A
复合索引是否也会对查询进行全面优化?
此外,我在 上创建了一个索引A
,但 Postgres 仍然只使用复合索引来查询A
。如果前面的答案是肯定的,我想这并不重要,但是为什么它默认选择复合索引,如果单个A
索引可用?
我们的系统写入了大量数据(一种大数据系统)。写入性能足以满足我们的需求,但读取性能真的太慢了。
我们所有表的主键(约束)结构都相似:
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) 相当简单的问题,可能在某处得到了回答,但我似乎无法为 Google 形成正确的搜索问题......
在查询该表的子集时,特定表中的列数是否会影响查询的性能?
例如,如果表 Foo 有 20 列,但我的查询只选择了其中的 5 列,那么有 20(而不是 10)列会影响查询性能吗?为简单起见,假设 WHERE 子句中的任何内容都包含在这 5 列中。
除了操作系统的磁盘缓存之外,我还担心 Postgres 的缓冲区缓存的使用。我对 Postgres 的物理存储设计一无所知。表存储在多个页面上(默认为每页 8k 大小),但我不太明白元组是如何从那里排列的。PG 是否足够聪明,只能从磁盘中获取包含这 5 列的数据?
我需要从另一个表更新一个表,我需要更新所有列。除了列出SET
子句中的每一列之外,有没有办法一次更新它们?像这样:
update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id
Run Code Online (Sandbox Code Playgroud)
我在 psql 中尝试过,它不起作用。我必须像这样列出每一列:
update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id
Run Code Online (Sandbox Code Playgroud)
tableB
创建使用create .. like tableA
. 所以它们基本上是相同的。我这样做的原因是我需要将 .csv 数据加载到临时表tableB
,然后tableA
根据.csv 中的新数据进行更新tableB
。tableA
需要尽量少加锁,tableA
需要保持完整性。我不确定“删除然后插入”是否是一个不错的选择?