使用Postgres 9.6,我创建了一个435百万行的表,其大小为120 in,并添加了一个大小为11 in的索引。
现在我想迭代索引的不同值,但是查询失败了,没有错误,它只是没有完成。我可以看到没有cpu使用或内存正在使用。注:服务器位于aws rds上,内存为15 Nb。
如何最好地解决这个问题?使用LIMIT和OFFSET迭代它的尝试在大约3个周期后失败。我还没有得到索引中的一些唯一值。
我将尝试重新索引,看看是否确实有任何损坏,但任何建议使用一个11 if的索引将是很好的。
编辑以添加更多信息:
这是我桌子的格式
id bigint,
hit1 character varying(50),
hit2 character varying(50),
offset integer,
year character varying(50)据postgres估计,行估计为4.31亿行,大约为115 to。
索引位于大小为11 of的hit1列上。
我试图计算点击数:
select hit1,hit2, count(distinct id) as total_count_of_ids,
count(case when offset=-1 then 1 else null end) as prev_position,
count(case when offset=0 then 1 else null end) as same_position,
count(case when offset=1 then 1 else null end) as next_position,
min(cast(substring(year,1,4) as int)) as min_year,
max(cast(substring(year,1,4) as int)) as max_year,
array_agg( id) as id_list
from table where hit1=''
group by hit1, hit2;由于桌子很大,我选择了这样一个接一个地做:
select distinct hit1 from table limit 250 offset x
-- use above query to to store results into table. 此函数包装在另一个函数中,该函数从循环中提供x。函数在dblink上下文中运行,这样就可以存储结果,并且我可以在执行过程中进行审计。
循环需要运行1,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,我还没有得到一个计数的不同的hit1值,因为查询需要太长时间才能返回。前750个值(3次迭代)在每一分钟内返回迭代,但在下一次迭代中它会翻过来。当这个迭代结束时,我将提供日志数据。
当查询正在运行时(在计算不同列表时),cpu的使用率似乎很低。似乎也有一些内存不可用。


编辑2以显示结果:在函数中,我使用dblink进行审计。在前3个周期(0-2)之后,从表限制250偏移750中选择不同的hit1返回结果需要一个小时;与以前的hit1顺序相比,该顺序不按字母顺序排列,而且似乎返回或死亡只导致77次结果。
https://dba.stackexchange.com/questions/180176
复制相似问题