GROUP BY с использованием Perl - PullRequest
       20

GROUP BY с использованием Perl

1 голос
/ 06 декабря 2010

У меня есть тонна журналов SQL, из которых я хочу извлечь данные.Эта задача занимает очень много времени, потому что я группируюсь по нескольким столбцам.Таким образом, я решил извлечь журналы вместе со столбцами, по которым я обычно группировался, без выполнения GROUP BY на стороне SQL.Вместо этого я хочу использовать Perl для группировки.При использовании Perl решение, о котором я думаю, - это создать n-мерный хеш для группировки по различным столбцам.Существуют ли какие-либо утилиты командной строки или функции Perl, которые позволят мне сделать то же самое?

1 Ответ

2 голосов
/ 06 декабря 2010
  1. Как сказал Ether в комментарии, позвольте инструменту, который был фактически сконструирован и оптимизирован для работы, делать свою работу. Сервер баз данных, выполняющий правильно оптимизированный запрос, ОЧЕНЬ вряд ли будет работать медленнее, чем вы сами можете достичь за пределами БД.

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

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

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

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

    # 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;
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...