优化Postgresql查询
我有两个表,我必须查询我的postgresql数据库。表1有大约1.4亿条记录,表2有大约5000万条以下记录 表1的结构如下:优化Postgresql查询,sql,postgresql,query-optimization,Sql,Postgresql,Query Optimization,我有两个表,我必须查询我的postgresql数据库。表1有大约1.4亿条记录,表2有大约5000万条以下记录 表1的结构如下: tr_id bigint NOT NULL, # this is the primary key query_id numeric(20,0), # indexed column descrip_id numeric(20,0) # indexed column 表2的结构如下 query_pk bigint # this is the pr
tr_id bigint NOT NULL, # this is the primary key
query_id numeric(20,0), # indexed column
descrip_id numeric(20,0) # indexed column
表2的结构如下
query_pk bigint # this is the primary key
query_id numeric(20,0) # indexed column
query_token numeric(20,0)
表1的样本数据库为
1 25 96
2 28 97
3 27 98
4 26 99
表2的样本数据库为
1 25 9554
2 25 9456
3 25 9785
4 25 9514
5 26 7412
6 26 7433
7 27 545
8 27 5789
9 27 1566
10 28 122
11 28 1456
我更喜欢能够以tr_id块为单位进行查询的查询。范围为10000,因为这是我的要求
我希望通过以下方式获得输出
25 {9554,9456,9785,9514}
26 {7412,7433}
27 {545,5789,1566}
28 {122,1456}
select query_id,
array_agg(query_token)
from sch.table2
where query_id in (select query_id
from sch.table1
where tr_id between 90001 and 100000)
group by query_id
我试着用下面的方式
25 {9554,9456,9785,9514}
26 {7412,7433}
27 {545,5789,1566}
28 {122,1456}
select query_id,
array_agg(query_token)
from sch.table2
where query_id in (select query_id
from sch.table1
where tr_id between 90001 and 100000)
group by query_id
我正在执行下面的查询,大约需要121346毫秒,当触发4个这样的查询时,仍然需要更长的时间。你能帮我优化一下吗
我有一台在Windows7上运行的机器,带有i7第二代程序和8GB内存
下面是我的postgresql配置
shared_buffers = 1GB
effective_cache_size = 5000MB
work_mem = 2000MB
我应该做些什么来优化它
谢谢
编辑:如果结果按照以下格式排序,那就太好了
25 {9554,9456,9785,9514}
28 {122,1456}
27 {545,5789,1566}
26 {7412,7433}
ie根据tr_id排序的表1中查询id的顺序。如果这在计算上很昂贵,可能在客户端代码中,我会尝试对其进行优化。但我不确定它的效率有多高
谢谢
我预计加入
的速度要比您目前处于的状态快得多:
SELECT t2.query_id
,array_agg(t2.query_token) AS tokens
FROM t1
JOIN t2 USING (query_id)
WHERE t1.tr_id BETWEEN 1 AND 10000
GROUP BY t1.tr_id, t2.query_id
ORDER BY t1.tr_id;
这还会根据请求对结果进行排序<根据query\u id
,code>query\u令牌保持未排序状态
索引
显然,您需要在t1.tr\u id
和t2.query\u id
上建立索引
很明显,你已经有了这个:
CREATE INDEX t2_query_id_idx ON t2 (query_id);
t1
上的多列索引可能会提高性能(您必须进行测试):
服务器配置
如果这是一个专用数据库服务器,您可以进一步提高有效缓存大小的设置
@弗兰克已经就工作提供了建议。我引述:
请注意,对于复杂的查询,可能需要执行多个排序或哈希操作
并行运行;每个操作将被允许使用尽可能多的时间
在开始将数据写入内存之前,此值指定的内存
临时文件。此外,一些正在运行的会话也可能会这样做
同时开展业务。因此,使用的总内存可能是
工作价值的许多倍
它应该足够大,能够在RAM中对查询进行排序。10MB对于一次容纳10000行来说已经足够了。如果一次需要更多的查询,请将其设置得更高
由于专用数据库服务器上有8GB的内存,我会尝试将共享_缓冲区
设置为至少2GB
shared_buffers = 2GB
effective_cache_size = 7000MB
work_mem = 10MB
更多建议。在查询前添加一个解释,看看瓶颈在哪里。解释分析更好,还可以显示花费的时间(以毫秒为单位)。“work_mem=2000MB”是危险的,一个查询可能会占用您所有的RAM(您只有8GB)并崩溃。10MB是一个良好且安全的起点。这是一个专用的数据库服务器吗?例如,PostgreSQL可以使用大部分资源?谢谢您的评论。但是,它不是专用数据库服务器。它不是专用服务器。除了缓存大小,我将把它设置得更低一点。谢谢你的建议