1

call_idにインデックスを使用するこのようなクエリがありますが、値に_を追加すると、インデックス検索からseq検索に変わります。

explain analyze 
DELETE 
FROM completedcalls 
WHERE call_id like '560738a563616c6c004c7621@198.148.114.67-b2b1';


                                                           QUERY PLAN                                                           
--------------------------------------------------------------------------------------------------------------------------------
 Delete on completedcalls  (cost=0.00..8.67 rows=1 width=6) (actual time=0.036..0.036 rows=0 loops=1)
   ->  Index Scan using i_call_id on completedcalls  (cost=0.00..8.67 rows=1 width=6) (actual time=0.034..0.034 rows=0 loops=1)
         Index Cond: ((call_id)::text = '560738a563616c6c004c7621@198.148.114.67-b2b1'::text)
         Filter: ((call_id)::text ~~ '560738a563616c6c004c7621@198.148.114.67-b2b1'::text)
 Total runtime: 0.069 ms
(5 rows)

この文:

explain analyze 
DELETE 
FROM completedcalls 
WHERE call_id like '560738a563616c6c004c7621@198.148.114.67-b2b_1';

この実行プランを返します。

QUERY PLAN                                                       
-----------------------------------------------------------------------------------------------------------------------
 Delete on completedcalls  (cost=0.00..39548.64 rows=84 width=6) (actual time=194.313..194.313 rows=0 loops=1)
   ->  Seq Scan on completedcalls  (cost=0.00..39548.64 rows=84 width=6) (actual time=194.310..194.310 rows=0 loops=1)
         Filter: ((call_id)::text ~~ '560738a563616c6c004c7621@198.148.114.67-b2b_1'::text)
 Total runtime: 194.349 ms
(4 rows)

私の質問は、クエリでこれらの文字をエスケープする方法です。Pythonでpsycopg2を使用する。

4

1 に答える 1

4

_次のように、バックスラッシュでをエスケープする必要があります。

DELETE FROM completedcalls 
WHERE call_id like '560738a563616c6c004c7621@198.148.114.67-b2b\_1';

また、パターンマッチングが必要ない場合は、=の代わりに使用する方が理にかなっていますLIKE

于 2013-01-15T15:54:01.687 に答える