колонка, по которой делается самый обычный индекс:
CREATE INDEX ON table_name column_name;
Реально ли обмануть постгрю и подменить этот индекс на индекс, например, с данными, сведёнными к нижнему регистру, в духе:
CREATE INDEX ON table_name USING btree (lower(column_name));
Так, чтобы на запрос
SELECT * FROM table_name WHERE column_name=val;
выдавались результаты (очевидно, не всегда верные) с помощью этого индекса?
а зачем именно обманывать постгрес?
чтобы поменять логику, но сохранить обратную совместимость для старых данных
а что мешает просто перестроить индекс? и использовать его всегда?
Видимо там на бэке куча всякого. И нед представлений.
Это никак не мешает удалить старый индекс и создать новый
большой объём данных, довольно неприятная процедура получается с перестроением индекса. Но, вероятно, придётся
Это самый очевидный вариант, выбираете время, когда меньше всего нагрузки и все
что неприятного и причем тут объем? делаете новый индекс хоть всю ночь, потом заменяете старый на него
Легче в запросе SELECT * FROM tab WHERE lower(col) = LOWER(val);
это потребует новый функциональный индекс
да, замена хороший вариант, спасибо!
да, пожалуй, вопрос выглядит совсем диким, но задача довольно реальная и заключается в том, что есть много больших таблиц с одинаковой логикой, которую в какой-то момент было решено поменять. Новая логика требует нового индекса, а перевести всё сразу на новые рельсы проблематично. Отсюда и попытка как-то схитрить, оставив временно обратную совместимость
ну сделайте два индекса, вам места не хватит что ли? новые запросы будут автоматически брать новый индекс, если where под него подходит. А когда все клиенты перейдут, старый удалите
да, похоже, это самый разумный вариант!
Обсуждают сегодня