
いつもお世話になっております。
テーブル同士のLIKE検索(前方一致)を行った場合、
INDEXが有効になりません。
LIKE検索文字列を固定にした場合は、INDEXが有効
になります。
テーブル同士のLIKE(前方一致)でINDEXを
有効にする手段をご教授頂けないでしょうか。
以下、実行結果です。
(1)LIKE検索文字列が固定
----------------------------------------------------------------------------
EXPLAIN
SELECT * FROM wk_dss_data WHERE sys_id LIKE 'M004964%';
----------------------------------------------------------------------------
Index Scan using i_wk_dss_data_02 on wk_dss_data (cost=0.00..5.25 rows=1 width=311)
Index Cond: (((sys_id)::text >= 'M004964'::character varying) AND ((sys_id)::text < 'M004965'::character varying))
Filter: ((sys_id)::text ~~ 'M004964%'::text)
(2)テーブル同士のLIKE検索
----------------------------------------------------------------------------
EXPLAIN
SELECT wk_dss_data.comp_id, wk_dss_data.user_id FROM wk_dss_data, t_update
WHERE
wk_dss_data.sys_id LIKE t_update.sys_id||'%';
----------------------------------------------------------------------------
Nested Loop (cost=157.00..12505636.00 rows=2500000 width=20)
Join Filter: (("outer".sys_id)::text ~~ (("inner".sys_id)::text || '%'::text)
)
-> Seq Scan on wk_dss_data (cost=0.00..5479.00 rows=100000 width=31)
-> Materialize (cost=157.00..207.00 rows=5000 width=11)
-> Seq Scan on t_update (cost=0.00..157.00 rows=5000 width=11)
No.1ベストアンサー
- 回答日時:
私も、以前同じ現象になって調べました。
PostgreSQLでは、like検索には通常のindexは使われないようです。
versionは、8.0.xでした。
likeを使うようにインデックスを作成するにはvarchar_pattern_opsオプションを付けます。
<code>
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
</code>
詳しくは参考URLを見てみてください。
参考URL:http://www.postgresql.jp/document/pg803doc/html/ …
この回答への補足
DQさん
お世話になります。
以下のインデックスを作成し実行しましたが
インデックスが使われませんでした。
ほかに考慮点ございましたらご教授頂けると
幸いです。
以下、インデックス作成
create index i_test ON t_update (sys_id varchar_pattern_ops);
create index i_test2 ON wk_dss_data (sys_id varchar_pattern_ops);
No.2
- 回答日時:
私はこれで解決できたのですが、別の問題なのでしょうか。
あとはPostgreSQLのオプティマイザですね。
Alanizeオプションをつけてvacuumを実行してみてはどうでしょうか。
参考URL:http://www.postgresql.jp/document/pg732doc/refer …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
postgreSQLのint型は桁数指定が...
-
PostgressからMySQL(MariaDB)...
-
テーブルからのselectにおいて...
-
マルチテーブル・インサート
-
UNIQUEをつけたときのINDEXテー...
-
異なるスキーマからデータを抽...
-
データを削除しても表領域の使...
-
Viewにインデックスは張れ...
-
グループ化したいのですが
-
SQL*Loaderで、データを加工し...
-
ORA-00959: 表領域'****'は...
-
datapumpの実行方法について
-
DELETE文でFROM句を省略した場合
-
Data Pump で大量データインポ...
-
CLOB型へのINSERT
-
C#でaccdbファイルのテーブルの...
-
RDBのテーブル種類の違い
-
同じSELECT文同士でのデ...
-
object browser で処理を中断す...
-
特定のスキーマのテーブルを一...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
postgreSQLのint型は桁数指定が...
-
テーブルからのselectにおいて...
-
PostgressからMySQL(MariaDB)...
-
ビット演算結果の取得
-
UNIQUEをつけたときのINDEXテー...
-
plpgsqlのエスケープ文字について
-
PostgresSQL8.4でツリー上に取...
-
SQL SELECT文 別テーブルのレコ...
-
クエリアナライザのsp_helpコマ...
-
pg_queryで変数の取り扱い方
-
テーブル作成 外部参照 配列
-
indexを使おうとしない間違った...
-
ベスト3の抽出方法
-
賢いSQL文がわからない
-
チェックボックスから、データ...
-
phpPgAdminからSQL文を発行し、...
-
SQLで検索結果の記事を表示したい
-
データを削除しても表領域の使...
-
Viewにインデックスは張れ...
-
ORA-00959: 表領域'****'は...
おすすめ情報