2010-12-06 77 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; 
    }