質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

2172閲覧

postgresql 高速化について

rgaruaru

総合スコア26

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

2クリップ

投稿2015/11/09 13:54

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

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

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

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

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

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pi-chan

2015/11/09 14:01

高速化したいテーブルの構造が分からないと具体的な回答が難しいと思います。
guest

回答2

0

ベストアンサー

postgresqlというよりは一般的なDB設計になりますが

既存のテーブル構造の変更が許されるのであれば、
CSVでデータを投入するのではなく、ユーザ毎にレコードを分ける形で

[ログテーブル]
id
ロググループID(複数のユーザに対して一括処理したタイミングで同じIDが作られる)
ユーザーコード(1ユーザ1レコードにする、インデックスを張る)

というテーブルにして、ユーザーコードを完全一致で検索すればかなり早くなると思うのですが、
こういったアプローチは要件的に難しそうですか?
*一括処理時のユーザ数によってはレコード数が爆発的に増える可能性があるので、実際の条件で計算してみないとわからないとは思います。
*データ投入時のコストは確実に増えるので、そのあたりのトレードオフが認められるかというのもあります。

投稿2015/11/09 14:11

編集2015/11/09 14:18
tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rgaruaru

2015/11/13 05:21

回答ありがとうございます。 仰る通り、現在の状態がsqlのアンチパターンということで、その認識がありませんでした。 今回は単一カラムに保存されているユーザーコードをカンマ区切りでばらして別テーブルに移して正規化して対応する事になりそうです。 実際の条件で計算してみたところ、億単位のレコード件数になりました。 検索の仕方によってムラは出てしまいますが、思った以上に早くなりました。
guest

0

TEXT型でもindexが張れたら劇的に早くなります。ただ、
テキスト検索の方法とインデックスにある、indexのサイズは気にした方が良いかもしれません。
PostgreSQLではtext型にindexが張れて便利ですね。
mysqlではMySQLのUNIQUEなINDEXには長さ767byteまでしか使えないで、なくなくvarchar(255)とかしたものです。。。

投稿2015/11/09 14:25

Ken.sakanakana

総合スコア1768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rgaruaru

2015/11/13 05:15

「PostgreSQLではtext型にindexが張れて」 →pg_trgmのことでしょうか。 検討してみましたが、適用すると2文字以下は逆に検索が遅くなるということで他の検索にも影響が及ぶため、今回はボツにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問