QA@IT

postgresql 高速化について

3872 PV

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

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

そのログから該当のユーザーのログを検索する際に、現状では
select * from log_table where user_code like '%ユーザーコード%';
の様に中間一致で検索しています。

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

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

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

回答

Like の部分一致だとインデックスが利用できないので遅くなりますね。

ここはテーブルを分割(正規化)して、インデックスを利用できるような設計に変更すべきです。

設計例
log_table (logID, logDate, ・・・・)
logID 主キー

log_user_table (logID, user_Code)
logID, userCode で複合主キー
logID, userCode にインデックス

select log_table.*
from log_table inner join log_user_table
     on log_table.logID = log_user_table.logID
where log_user_table.user_code = 'ユーザーコード';
編集 履歴 (0)
  • 回答ありがとうございます。
    仰る通り、現在の状態がsqlのアンチパターンということで、その認識がありませんでした。
    今回は単一カラムに保存されているユーザーコードをカンマ区切りでばらして別テーブルに移して正規化して対応する事になりそうです。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。