我将拥有一个巨大的 PostgreSQL 9.3 数据库,其中包含许多表,每个表有超过 1 亿个条目。该数据库将基本上是只读的(一旦我填写了所有必要的表并构建了索引,不再对 DB 进行写操作)和单用户访问(从 localhost 运行和基准测试多个查询),因为将使用 DB仅用于研究目的。查询将始终在整数 DB 字段上使用 JOIN。
为此,我可能会购买 SSD (256-512GB)。我以前没有用过 SSD 做数据库,所以有什么我应该害怕的吗?我可以将整个数据库放在 SSD 上,还是只放在索引上?为 SSD 调整 PostgreSQL 是否需要任何特别的建议/教程?请注意,我有一个配备 i7 和 32Gb 内存的不错的工作站,所以也许您也可以提供一些建议。
我有两张桌子,left2
和right2
。两个表都会很大(1-10M 行)。
CREATE TABLE left2(id INTEGER, t1 INTEGER, d INTEGER);
ALTER TABLE left2 ADD PRIMARY KEY (id,t1);
CREATE TABLE right2( t1 INTEGER, d INTEGER, arr INTEGER[] );
ALTER TABLE right2 ADD PRIMARY KEY(t1,d);
Run Code Online (Sandbox Code Playgroud)
我将执行这种类型的查询:
SELECT l.d + r.d,
UNIQ(SORT((array_agg_mult(r.arr)))
FROM left2 l,
right2 r
WHERE l.t1 = r.t1
GROUP BY l.d + r.d
ORDER BY l.d + r.d;
Run Code Online (Sandbox Code Playgroud)
在哪里聚合数组我使用函数:
CREATE AGGREGATE array_agg_mult(anyarray) (
SFUNC=array_cat,
STYPE=anyarray,
INITCOND='{}');
Run Code Online (Sandbox Code Playgroud)
连接数组后,我使用模块的UNIQ
功能intarray
。有没有更有效的方法来做到这一点?该arr
字段上是否有任何索引可以加速合并(删除重复项)?聚合函数可以直接去除重复吗?如果有帮助,可以将原始数组视为已排序(并且它们是唯一的)。
SQL小提琴在这里:
我有一个巨大的整数数组列表(300,000,000 条记录)存储在 Postgres 9.2 DB 中。我想有效地搜索这些记录以获得完全匹配(仅相等)。我听说过 intarray 模块和相应的 gist-gin 索引。我想问以下问题:
假设我有以下数据:
| f1 | f2 | f3 |
|----|----|----|
| 1 | 1 | 1 |
| 1 | 1 | 5 |
| 1 | 2 | 3 |
| 1 | 2 | 6 |
| 1 | 3 | 4 |
| 1 | 3 | 7 |
| 2 | 1 | 2 |
| 2 | 1 | 22 |
| 2 | 2 | 3 |
| 2 | 2 | 4 |
Run Code Online (Sandbox Code Playgroud)
每个 …
使用此命令,我可以生成 1 和 200,000 之间的 16384 个随机整数。
SELECT generate_series (1,16384),(random()*200000)::int AS id
Run Code Online (Sandbox Code Playgroud)
我想生成 10 组这样的整数。每个集合必须有一个整数标识符,类似于:
1 | 135
1 | 1023
...第一组 16384 个随机数结束
2 | 15672
2 | 258732
... 第二组 16384 个随机数结束
这可以通过 SQL 命令实现,还是我应该为此编写一个函数?