Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化Postgresql查询_Sql_Postgresql_Query Optimization - Fatal编程技术网

优化Postgresql查询

优化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

我有两个表,我必须查询我的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 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可以使用大部分资源?谢谢您的评论。但是,它不是专用数据库服务器。它不是专用服务器。除了缓存大小,我将把它设置得更低一点。谢谢你的建议