postgresql 大数据量检索效率问题

kbryant 2009-10-30 09:52:37
现在我有下面这段sql文

SELECT to_char(timegenerated,'YYYY-MM-DD') as timeStr,type as type,count(*) AS num
FROM table1
WHERE
createdate > '某时间'
GROUP BY timeStr,type

现在我table1表里有1000w条数据,执行这段sql文时速度比较慢,怎么优化下,主要是sql文里用到了函数to_char,还有GROUP BY 什么的,影响了速度,有人说先全件检索出来,只是order by一下,然后在后台java代码里去做to_char和group by 的工作,相当于把sql文的工作拿到后台去做,这样效率会比现在的高吗?全部拿出来1000w条哦,后台要循环1000w遍遍历结果集处理我觉得也不会快啊。。。望高人指教
...全文
1627 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kangde 2009-11-01
  • 打赏
  • 举报
回复
学习了
ACMAIN_CHM 2009-10-30
  • 打赏
  • 举报
回复
建立基于 (createdate,timegenerated) 的复合索引。但效果不会太大。因为你用到了函数 to_char
WWWWA 2009-10-30
  • 打赏
  • 举报
回复
在postgresql中有无类似MYSQL EXPLAIN的命令,检查在地方执行速度慢
kbryant 2009-10-30
  • 打赏
  • 举报
回复
CREATE INDEX createdate_cindex ON table1(createdate)

就这样建立索引就可以了?好像检索起来还是很慢阿
ACMAIN_CHM 2009-10-30
  • 打赏
  • 举报
回复
根据11 楼的提示,创建基于表达式的索引!


CREATE INDEX xxxxx ON table1 (createdate, to_char(timegenerated,'YYYY-MM-DD'));
或者
CREATE INDEX yyyyy ON table1 (to_char(timegenerated,'YYYY-MM-DD'),createdate);
ACMAIN_CHM 2009-10-30
  • 打赏
  • 举报
回复
同意楼上,及楼上的楼上

其实有些数据仓库的概念进来了。
WWWWA 2009-10-30
  • 打赏
  • 举报
回复
在createdate上建立索引,这样试试
SELECT timeStr,type as type,count(*) AS num from (
SELECT *,to_char(timegenerated,'YYYY-MM-DD') as timeStr FROM table1 WHERE
createdate > '某时间' ) a
GROUP BY timeStr,type
trainee 2009-10-30
  • 打赏
  • 举报
回复
同意楼上的.
用于网站的数据库设计,要多点沉余。

另:postgresql可以建立表达式索引
to_char(timegenerated,'YYYY-MM-DD')
vinsonshen 2009-10-30
  • 打赏
  • 举报
回复
列createdate要建立索引,从你上面的处理需求来看,这个是不可避免的了
vinsonshen 2009-10-30
  • 打赏
  • 举报
回复
有人说先全件检索出来,只是order by一下,然后在后台java代码里去做to_char和group by 的工作,相当于把sql文的工作拿到后台去做

---------------
这个是不可取的
因为那么多的数据传回客户端,这就是个大问题了
wwwwb 2009-10-30
  • 打赏
  • 举报
回复
OR
在生成NEWTT后,在timeStr,type上建立索引再分组
WWWWA 2009-10-30
  • 打赏
  • 举报
回复
你的索引情况,在createdate上建立索引试试
SELECT to_char(timegenerated,'YYYY-MM-DD') as timeStr,type as type AS num into newtt
FROM table1 WHERE createdate > '某时间'

select timeStr,type as type,count(*) AS num from newtt GROUP BY timeStr,type
这样试试
vinsonshen 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kbryant 的回复:]
CREATE INDEX createdate_cindex ON table1(createdate)

就这样建立索引就可以了?好像检索起来还是很慢阿

[/Quote]

像这样的统计需求,表数据有点多,从你语句上来说,索引上优化也只能这个程度了
其实,我觉得应该在表设计上进行优化,根据数据量设计一个“最近明细数据表”,然后每天将前一天的数据进行汇总统计,然后将统计结果放进一个“汇总数据表”,统计完后,马上将前一天的明细数据备份进“历史明细表”,然后“最近明细数据表”对应天的数据清理掉。
这样,像你上面的统计需求,只需要对“汇总数据表”进行统计就可以了(速度会快很多)。
vinsonshen 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kbryant 的回复:]
CREATE INDEX createdate_cindex ON table1(createdate)

就这样建立索引就可以了?好像检索起来还是很慢阿

[/Quote]
估计是
“SELECT count(*) FROM table1 WHERE createdate > '某时间' ”
符合的记录数太多了,这样读取的IO量当然也大,自然就慢了

不信你可以把'某时间'的范围指定为尽量的短测试下(如> '昨天')
postgresql-10.10-2-linux-x64-binaries.tar.gz 安装包 PostgreSQL经历了长时间的演变。该项目最初开始于在加利福尼亚大学伯克利分校的Ingres计划。这个计划的领导者迈克尔·斯通布雷克在1982年离开加利福尼亚大学伯克利分校去推进Ingres的商业化,但最后还是返回了学术界。在1985年返回伯克利之后,斯通布雷克开始了post-Ingres计划,致力于解决在1980年代早期所出现一些数据库系统存在的问题。Postgres和Ingres的代码库开始(并保持)完全分离。 新项目Postgres的目的是通过增加最少的功能来完全支持所需要的类型。这些功能包括类型定义和完整描述数据关系的能力。完整描述数据关系的能力之前虽广为使用但却需要由用户来维护。Postgres的数据库能够"理解"关系,并可以使用一定的规则以自然方式在相关的表中检索信息。 从1986年开始,该项目组发表了一些描述这一系统基本原理的论文,并在1988年实现并运行了一个Demo版本。项目组在1989年六月向少数用户发行了版本1.0,随后在1990年6月发行了带有全新规则系统的版本2.0。1991年的版本3.0再次重写了规则系统,并增加了对多个存储管理器的支持与改进的查询引擎。Postgres在1993年开始拥有大用户,这些用户提供了大的功能与优化建议。但是在发行了作为细节修正的版本4.0之后,Postgres计划就终止了。

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧