我在Postgres 9.2中有下表(简化形式)
CREATE TABLE log (
log_date DATE,
user_id INTEGER,
payload INTEGER
);
Run Code Online (Sandbox Code Playgroud)
它每个用户和每天最多包含一条记录.每天将有大约500,000条记录,为期300天.每个用户的running_total总是在增加.
我想在特定日期之前有效地检索每个用户的最新记录.我的查询是:
SELECT user_id, max(log_date), max(payload)
FROM log
WHERE log_date <= :mydate
GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)
这非常慢.我也尝试过:
SELECT DISTINCT ON(user_id), log_date, payload
FROM log
WHERE log_date <= :mydate
ORDER BY user_id, log_date DESC;
Run Code Online (Sandbox Code Playgroud)
具有相同的计划,同样缓慢.
到目前为止,我在user_msg_log(aggr_date)上有一个索引,但没有多大帮助.我应该用什么其他索引来加快速度,还是以任何其他方式实现我的目标?
sql postgresql indexing greatest-n-per-group postgresql-performance
我注意到我的Ruby(1.9)脚本中存在一些极端延迟,经过一些挖掘后,它归结为正则表达式匹配.我在Perl和Ruby中使用以下测试脚本:
Perl的:
$fname = shift(@ARGV);
open(FILE, "<$fname" );
while (<FILE>) {
if ( /(.*?) \|.*?SENDING REQUEST.*?TID=(.*?),/ ) {
print "$1: $2\n";
}
}
Run Code Online (Sandbox Code Playgroud)
红宝石:
f = File.open( ARGV.shift )
while ( line = f.gets )
if /(.*?) \|.*?SENDING REQUEST.*?TID=(.*?),/.match(line)
puts "#{$1}: #{$2}"
end
end
Run Code Online (Sandbox Code Playgroud)
我对两个脚本使用相同的输入,一个只有44290行的文件.每个人的时间安排是:
Perl的:
xenofon@cpm:~/bin/local/project$ time ./try.pl input >/dev/null
real 0m0.049s
user 0m0.040s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
红宝石:
xenofon@cpm:~/bin/local/project$ time ./try.rb input >/dev/null
real 1m5.106s
user 1m4.910s
sys 0m0.010s
Run Code Online (Sandbox Code Playgroud)
我想我正在做一些非常愚蠢的事情,有什么建议吗?
谢谢
我的控制器中有以下方法:
@RequestMapping( value="/servers/{server}", method = RequestMethod.GET )
public @ResponseBody List<Application> getServerInformation( String server ) {
logger.debug( "Request for server: " + server );
...
}
Run Code Online (Sandbox Code Playgroud)
当我请求/servers/test.myserver.com时,绑定变量的值为test.myserver.通常,对于包含点分隔值的任何请求,最后一部分将从绑定变量的值中省略.我使用的是Spring 3.0.4
有什么建议?
谢谢
-XX:+ UseParallelGC和-XX:-UseParallelGC有什么区别?大多数链接表示第一个,但http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html提到第二个.
谢谢.
我们在RedHat中使用Postgres 9.2.我们有一个类似于以下的表:
CREATE TABLE BULK_WI (
BULK_ID INTEGER NOT NULL,
USER_ID VARCHAR(20) NOT NULL,
CHUNK_ID INTEGER,
STATE VARCHAR(16),
CONSTRAINT BASE_BULK_WI_PK PRIMARY KEY(BULK_ID,USER_ID)
);
CREATE INDEX BASE_BULK_WI_IDX01 ON BULK_WI(STATE, CHUNK_ID);
Run Code Online (Sandbox Code Playgroud)
作为批处理作业的一部分,我们首先使用新的BULK_ID向表中添加许多行.所有新记录都有CHUNK_ID = NULL,STATE ='PENDING'.插入物在500K和1.5M行之间.发生这种情况时,表的大小超过15M记录.
在插入之后,我们开始以块的形式处理表.为此,我们首先为下一个块选择一些项目,然后处理它们.使用以下查询选择项目:
UPDATE BASE_BULK_WI wi SET wi.STATE = 'PROCESSING', wi.CHUNK_ID = $1
WHERE wi.STATE='PENDING' AND wi.BULK_ID = $2
AND wi.USER_ID IN
(SELECT USER_ID FROM BASE_BULK_WI WHERE BULK_ID = $3
AND CHUNK_ID IS NULL AND STATE='PENDING' LIMIT $4 FOR UPDATE)
Run Code Online (Sandbox Code Playgroud)
每次块迭代增加$ 1,$ 2和$ 3 …
sql postgresql batch-processing postgresql-9.2 postgresql-performance