2010-12-06 83 views
1

我有大量的SQL日志,我想从中提取数据。这项任务需要很长时间,因为我按几列分组。因此,我决定在没有在SQL端执行GROUP BY的情况下提取日志以及我通常会分组的列。相反,我想用Perl来做我的分组。当使用Perl时,我想到的解决方案是创建一个n维散列,通过不同的列进行分组。有没有任何命令行工具或Perl函数可以让我做同样的事情?GROUP BY使用Perl

+3

它可能不会是任何不是让你的数据库做得更快的分组。您应该考虑优化该查询。 – Ether 2010-12-06 18:56:50

+0

只是出于好奇......是什么让你相信你对群体有问题? – Ronnis 2010-12-06 21:38:15

回答

2
  1. 正如Ether在评论中所说的那样,让实际为工作设计和优化的工具能够完成这项工作。运行正确优化的查询的数据库服务器不会比你自己可以在数据库之外实现的速度慢。

    除此之外,您将浪费资源在网络上传输更多数据并需要更多内存。

    作为优化之一,尝试使用临时表,尽管没有完整的模式和查询和数据库引擎,我不会冒险提供任何特定的优化建议。

    DB外部方法有时可能会更好,例如,如果有非常少的行有重复的“分组”按键,在这种情况下,传输分组数据的资源几乎没有节省;而当你在Perl方面的逻辑必须将每一行存储在内存中,而不是迭代它们并抛出重复的内存。

  2. 如果你仍想尝试在Perl中做到这一点,一个好方法是做一个单级哈希,并开发一种廉价的方式来将你的唯一键列中的值编码成单个哈希值(包/在某些情况下可以使用解包,或者分割/连接,或者更具体情况,但表现更好的方式)。唯一的要求是编码值可以唯一映射回唯一键列值。

    # Store 
    my %storage; 
    foreach my $row (@$result_set) { 
        my $hash_key = encode_hash_key(row); 
        my $new_row = $row; 
        if (exists $storage{$hash_key}) { 
         $new_row = merge_rows($row, $storage{$hash_key}); 
        } 
        $storage{$hash_key} = $new_row; 
    }