8

基になる関数を変更すると、関数に基づいて作成されたインデックスはどうなりますか?

clean_name()たとえば、次のように定義された関数があります。

CREATE OR REPLACE FUNCTION clean_name(n text)
RETURNS TEXT AS
$BODY$
DECLARE
 rec TEXT;
BEGIN
 EXECUTE
  'SELECT Regexp_replace(' || quote_literal(n) || ', ''[a-z]'', '''', ''g'');'
 INTO rec;
RETURN rec;
END;
$BODY$ LANGUAGE plpgsql IMMUTABLE
;

次に、インデックスを作成します。

CREATE INDEX my_table_upper_name_btree
ON schema.my_table USING GIST (my_text_field);

しかし、代わりに大文字を削除するように関数を再定義することにしました。作成したインデックスはどうなりますか? それはそれ自体で変化しますか?私はDROPもう一度CREATEですか?VACUUM [ANALYZE] [FULL]?

(問題の関数は似ていますが、代わりに、まだ調整中ですが安定していると予想されるかなり長い一連の置換を使用しています。)

4

3 に答える 3

4

関数を変更すると、インデックスを再構築する必要があります。

create table t (i integer);
insert into t (i)
select generate_series(1, 100000);
analyze t;

逆の整数を返す単純な関数:

create or replace function f(i integer)
returns integer as $$
select i * -1;
$$ immutable language sql;

そしてその上のインデックス:

create index t_i_index on t(f(i));

インデックスは次のように使用されます。

explain select * from t order by f(i);
                                QUERY PLAN                                 
---------------------------------------------------------------------------
 Index Scan using t_i_index on t  (cost=0.00..3300.26 rows=100000 width=4)

関数は整数自体を返すように変更されました。

create or replace function f(i integer)
returns integer as $$
select i;
$$ immutable language sql;

そして、インデックスはもう使用されていません:

explain select * from t order by f(i);
                          QUERY PLAN                           
---------------------------------------------------------------
 Sort  (cost=11116.32..11366.32 rows=100000 width=4)
   Sort Key: i
   ->  Seq Scan on t  (cost=0.00..1443.00 rows=100000 width=4)

インデックスが再構築された場合

reindex index t_i_index;

再び使用されます:

explain select * from t order by f(i);
                                QUERY PLAN                                 
---------------------------------------------------------------------------
 Index Scan using t_i_index on t  (cost=0.00..4376.26 rows=100000 width=4)
于 2013-07-11T20:12:20.407 に答える