2017-11-22 11 views
3

クエリに大文字小文字または大文字小文字が混在している場合、トリグラムインデックスを持つテーブルは機能しません。 私が逃したものはわかりません。何か案は?Postgresql - trigram ginインデックスが大文字または小文字の大文字または小文字のILikeを持つテーブルでインデックスを使用しない

(PostgreSQLの9.6.2を使用してイム)

CREATE TABLE public.tbltest (
    "tbltestId" int NOT null , 
    "mystring1" text, 
    "mystring2" character varying, 
    CONSTRAINT "tbltest_pkey" PRIMARY KEY ("tbltestId") 
); 

insert into tbltest ("tbltestId","mystring1", "mystring2") 
select x.id, x.id || ' Test', x.id || ' Test' from generate_series(1,100000) AS x(id); 

CREATE EXTENSION pg_trgm; 

CREATE INDEX tbltest_idx1 ON tbltest using gin ("mystring1" gin_trgm_ops); 
CREATE INDEX tbltest_idx2 ON tbltest using gin ("mystring2" gin_trgm_ops); 

クエリ内のテキストが動作し、私は大文字と小文字を追加した場合などは、インデックスを使用していない

explain analyse 
select * from tbltest 
where "mystring2" Like '%test%'; 

QUERY PLAN                             | 
-----------------------------------------------------------------------------------------------------------------------------| 
Bitmap Heap Scan on tbltest (cost=20.08..56.68 rows=10 width=24) (actual time=29.846..29.846 rows=0 loops=1)    | 
    Recheck Cond: ((mystring2)::text ~~ '%test%'::text)                  | 
    Rows Removed by Index Recheck: 100000                      | 
    Heap Blocks: exact=726                          | 
    -> Bitmap Index Scan on tbltest_idx2 (cost=0.00..20.07 rows=10 width=0) (actual time=12.709..12.709 rows=100000 loops=1) | 
     Index Cond: ((mystring2)::text ~~ '%test%'::text)                 | 
Planning time: 0.086 ms                          | 
Execution time: 29.875 ms                         | 

インデックスを使用して下部ケースを使用して検索で

explain analyse 
select * from tbltest 
where "mystring2" Like '%Test%'; 

QUERY PLAN                         | 
--------------------------------------------------------------------------------------------------------------| 
Seq Scan on tbltest (cost=0.00..1976.00 rows=99990 width=24) (actual time=0.011..33.376 rows=100000 loops=1) | 
    Filter: ((mystring2)::text ~~ '%Test%'::text)                | 
Planning time: 0.083 ms                      | 
Execution time: 51.259 ms                      | 

のiLikeは、インデックスを使用しないか

答えて

2

PostgreSQLは最後の2つのクエリでインデックスを使用しません。これは、クエリを処理する最善の方法であり、使用できないためではありません。

EXPLAIN出力では、最初のクエリではゼロ行(actual ... rows=0)が返され、他の2つのクエリではテーブル内のすべての単一行が返されます(actual ... rows=100000)。

PostgreSQLオプティマイザの推定値は、その状況を正確に反映しています。

PostgreSQLは、テーブルのほとんどの行にアクセスする必要があるため、より複雑なインデックスアクセスメソッドを使用するよりも、テーブルを順番にスキャンするほうが結果がずっと安くなることがわかります。

+0

私は、私がwhere句を変更すると "where" mystring2 "iLike '%1%tEst%';"インデックスも使用します。しかし、 "どこで" mystring2 "iLike '%tEst%';"それはインデックスを使用しません。 – Haza