2010-12-06 4 views
1

У меня есть тонна SQL-журналов, из которых я хочу извлечь данные. Эта задача занимает очень много времени, потому что я группирую несколько столбцов. Таким образом, я решил извлечь журналы вместе с столбцами, которые я обычно группировал без выполнения GROUP BY на стороне SQL. Вместо этого я хочу использовать 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. Как сказал эфир в комментарии, пусть инструмент, который был спроектирован и оптимизирован для работы, выполняет эту работу. Сервер базы данных, работающий правильно оптимизированный запрос, очень маловероятен, чтобы быть медленнее, чем вы сами можете достичь вне БД.

    Помимо прочего, вы будете тратить ресурсы на передачу большего количества данных по сети и потребуется больше памяти.

    Как одна из оптимизаций, попробуйте использовать временную таблицу, хотя без полной схемы и запроса и механизма БД я бы не рискнул дать какой-либо конкретный совет по оптимизации.

    Внешний подход БД иногда может быть лучше, например, если есть ОЧЕНЬ ОЧЕНЬ несколько строк, которые имеют дублирующиеся «сгруппированные по» ключи, и в этом случае практически нет экономии ресурсов для передачи сгруппированных данных ; И когда ваша логика на стороне Perl потребовала бы хранения любой строки в памяти в любом случае вместо того, чтобы повторять их и отбрасывать итерации.

  2. Если вы все еще хотите попробовать это сделать в Perl, хороший подход - сделать хэш-представление SINGLE и разработать дешевый способ кодирования значений в ваших уникальных ключевых столбцах в одно значение хэш-функции (pack/распаковка может быть использована в некоторых случаях, а также для разделения/объединения или более конкретной ситуации, но более эффективными способами). Единственное требование состоит в том, что закодированное значение может быть однозначно отображено обратно в значения уникальных ключевых столбцов.

    # 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; 
    } 
    
Смежные вопросы