• 検索結果がありません。

2. プロセスとメモリー

3.8 ロケール指定

3.8.2 LIKE によるインデックスの使用

 ORDER BY句による順序

ロケール機能が有効になっているデータベースで文字列型に対するORDER BY句を指 定した場合、ロケールに応じた順序で出力されます。以下の表はエンコードUTF-8を使 用した場合の大小関係です。

表 42 ロケール指定による文字列の大小関係

大小関係 ja_JPロケール ロケールなし 備考 小

長さ0文字列 長さ0文字列 半角数字 半角数字 半角英字 半角英字 半角カナ ひらがな 全角数字 全角カタカナ 全角英字 全角数字 ひらがな 全角英数 全角カタカナ 半角カナ

NULL NULL

 半角/全角の区別

日本語ロケールが有効なデータベースでも、全角と半角データ別データとして扱われま す。またアルファベットの大文字/小文字も区別されます。

表 43 ロケール指定による大小関係

比較対象1(例) 比較対象2(例) 等しいか 備考 半角アルファベット(A) 全角アルファベット(A) 異なる

半角大文字(A) 半角小文字(a) 異なる 全角カタカナ(ア) 半角カタカナ(ア) 異なる 全角カタカナ(ア) 全角ひらがな(あ) 異なる

例 78 locale使用時のLIKE検索

実行計画がSeq Scanとなり、全件検索が行われていることが確認できます。このよう な事態を避けるためには、CREATE INDEX文実行時にオプションを指定し、バイナリに よるインデックス検索を行うように指定します。

CREATE INDEX文のオプション指定

列のデータ型に応じて以下のオプションを指定することができます。

表 44 バイナリ比較オプション

データ型 オプション 備考 varchar varchar_pattern_ops

char bpchar_pattern_ops text text_pattern_ops name name_pattern_ops

postgres=> CREATE TABLE locale1(c1 varchar(10), c2 varchar(10)) ; CREATE TABLE

postgres=> CREATE INDEX idx1_locale1 ON locale1(c1) ; CREATE INDEX

postgres=> INSERT INTO locale1 VALUES ('ABC', 'DEF') ; INSERT 0 1

postgres=> ANALYZE locale1 ; ANALYZE

postgres=> EXPLAIN SELECT C1 FROM locale1 WHERE C1 LIKE 'A%' ; QUERY PLAN

--- Seq Scan on locale1 (cost=0.00..1790.01 rows=10 width=5) Filter: ((c1)::text ~~ 'A%'::text)

Planning time: 1.742 ms (3 rows)

CREATE INDEX インデックス名 ON テーブル名 (列名 オプション)

例 79 オプション指定時のLIKE検索

3.8.3 <> 演算子によるインデックスの使用

LIKE演算子ではオプション指定が必要でしたが、大小を比較する演算子「<」「>」を指 定してインデックスを使用したい場合には、前節のオプションを指定することができませ ん。

postgres=> CREATE INDEX idx2_locale1 ON locale1(c2 varchar_pattern_ops) ; CREATE INDEX

postgres=> \d locale1

Table "public.locale1"

Column | Type | Modifiers ---+---+--- c1 | character varying(10) |

c2 | character varying(10) | Indexes:

"idx1_locale1" btree (c1)

"idx2_locale1" btree (c2 varchar_pattern_ops)

postgres=> EXPLAIN SELECT C2 FROM locale1 WHERE C2 LIKE 'A%' ; QUERY PLAN

--- Index Only Scan using idx2_locale1 on locale1 (cost=0.42..8.44 rows=10 width=5)

Index Cond: ((c2 ~>=~ 'A'::text) AND (c2 ~<~ 'B'::text)) Filter: ((c2)::text ~~ 'A%'::text)

Planning time: 0.541 ms (4 rows)

例 80 オプション指定時の大小比較検索 postgres=> \d locale1

Table "public.locale1"

Column | Type | Modifiers ---+---+--- c1 | character varying(10) |

c2 | character varying(10) | Indexes:

"idx1_locale1" btree (c1)

"idx2_locale1" btree (c2 varchar_pattern_ops)

postgres=> EXPLAIN SELECT c1 FROM locale1 WHERE c1 < '10' ; QUERY PLAN

--- Index Only Scan using idx1_locale1 on locale1 (cost=0.42..334.75 rows=306 width=5)

Index Cond: (c1 < '10'::text) Planning time: 0.210 ms

(3 rows)

postgres=> EXPLAIN SELECT c2 FROM locale1 WHERE c2 < '10' ; QUERY PLAN

--- Seq Scan on locale1 (cost=0.00..1790.01 rows=10 width=5) Filter: ((c2)::text < '10'::text)

Planning time: 0.140 ms (3 rows)