W ten sposób usuwam wszystkie indeksy z PostgreSQL, wyłączając wszystkie pkey.
CREATE OR REPLACE FUNCTION drop_all_indexes() RETURNS INTEGER AS $$
DECLARE
i RECORD;
BEGIN
FOR i IN
(SELECT relname FROM pg_class
-- exclude all pkey, exclude system catalog which starts with 'pg_'
WHERE relkind = 'i' AND relname NOT LIKE '%_pkey%' AND relname NOT LIKE 'pg_%')
LOOP
-- RAISE INFO 'DROPING INDEX: %', i.relname;
EXECUTE 'DROP INDEX ' || i.relname;
END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
Aby wykonać:
SELECT drop_all_indexes();
Przed faktycznie wykonujące 'DROP INDEX xxx', chciałbym wypowiedzieć się wiersz 'EXECUTE ...' przy użyciu '-', i odkomentować „RAISE INFO "wiersz, uruchom go za pomocą" wybierz func_name(); " i sprawdź dwukrotnie Nie upuszczam czegoś, czego nie powinienem.
Dla naszej aplikacji mamy wszystkie instrukcje schematów, w tym tworzenie indeksów w jednym pliku app.sql. Przed tym cały projekt trafia do produkcji, chcemy, aby oczyścić wszystkie historycznie utworzone indeksy, a następnie odtworzyć je za pomocą:
psql -f /path/to/app.sql
Nadzieja to pomaga.
http://stackoverflow.com/a/6777904/3961156 –
Kiedy mówisz "wszystkie indeksy", czy chcesz uwzględnić ograniczenia ('UNIQUE',' PK', 'EXCLUDE'), które są implementowane przez utworzenie indentycznie indeksować? –
Nie, tylko indeksy w tym przypadku. – Erin