postgresql 高速化について


タイトルの件について、質問をさせて頂きます。

システムからある処理を複数のユーザーに対して一括で処理した時に、処理したユーザーのコードをカンマ区切りでtext型でログテーブルにinsertしています。

そのログから該当のユーザーのログを検索する際に、現状では

[code]

    select * from log_table where user_code like '%ユーザーコード%';
    
[/code]

の様に中間一致で検索しています。

ログの量が増えて重くなってきたので、今回この処理を高速化しようと思っています。

今のところ、text型からinteger型の配列にすることで倍くらいは早くなる見込みがあるのですが、もっと早くする方法や他に方法はあるのでしょうか。

どなたかご教授をお願いします。




> 処理したユーザーのコードをカンマ区切りでtext型でログテーブルにinsertしています。

ログテーブルの単一のカラムに、カンマ区切りのユーザーコードのリストを押し込んでいるということだろうと思いますが、パフォーマンス面はおいても、まず
**正規化がされていない** 点が気になります。

ある一つの処理にidなりDateTimeなりで識別子を与え、それプラス、処理対象ユーザーコードの、2種類のカラムは最低用意する必要があると思います（正規化のためには）。

[code]

    Process_ID, user_code
    ---------------------
    1, 252533
    1, 252600
    2, 252533
    2, 252004
    2, 252111
    3, 252600
    4, 252533
    ...
    
[/code]

この2つをペアにして主キーとするか、一つ一つのログのエントリーにIDを付して主キーとすれば、一応正規化は達成できると思います。

このように正規化すれば、

[code]

    select * from log_table where user_code=252533;
    
[/code]

で、`like`によるパターンマッチを行う必要もなく、user_code
カラムの一致だけをデータベースが行えばいいので、おそらく、パフォーマンスの向上も期待できると思います。

