现在我有下面这段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遍遍历结果集处理我觉得也不会快啊望高人指教
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遍遍历结果集处理我觉得也不会快啊望高人指教
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
这样试试
在生成NEWTT后,在timeStr,type上建立索引再分组
这个是不可取的
因为那么多的数据传回客户端,这就是个大问题了
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
“SELECT count(*) FROM table1 WHERE createdate > '某时间' ”
符合的记录数太多了,这样读取的IO量当然也大,自然就慢了不信你可以把'某时间'的范围指定为尽量的短测试下(如> '昨天')
用于网站的数据库设计,要多点沉余。另:postgresql可以建立表达式索引
to_char(timegenerated,'YYYY-MM-DD')
CREATE INDEX xxxxx ON table1 (createdate, to_char(timegenerated,'YYYY-MM-DD'));
或者
CREATE INDEX yyyyy ON table1 (to_char(timegenerated,'YYYY-MM-DD'),createdate);