小编xpa*_*pad的帖子

优化GROUP BY查询以检索每个用户的最新记录

我在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

45
推荐指数
3
解决办法
3万
查看次数

正则表达式 - Ruby vs Perl

我注意到我的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)

我想我正在做一些非常愚蠢的事情,有什么建议吗?

谢谢

ruby regex perl

24
推荐指数
3
解决办法
3284
查看次数

在Spring MVC中使用@PathVariable绑定点分隔的字符串

我的控制器中有以下方法:

@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

有什么建议?

谢谢

java spring spring-mvc

8
推荐指数
2
解决办法
5164
查看次数

-XX:-UseParallelGC和-XX:+ UseParallelGC之间的区别

-XX:+ UseParallelGC和-XX:-UseParallelGC有什么区别?大多数链接表示第一个,但http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html提到第二个.

谢谢.

java jvm-arguments

5
推荐指数
1
解决办法
1422
查看次数

Postgres中的大插入后慢查询

我们在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

3
推荐指数
1
解决办法
1951
查看次数