1. Условие в частичном индексе или формула в функциональном должны быть ТАКИМИ ЖЕ, какими они будут в запросах.
Планировщики баз данных умеют минимальные оптимизации. В документации обычно так и пишут: "у нас тут не софт для теоретической алгебры, пишите нормально!".
Postgresql, например, поймет, если частичный индекс будет создан для
a > 1и в запросе будет использовано выражение
a > 2
Но для выражения
a + 1 > 0никаких оптимизаций сделано не будет.
Кстати, хозяйке на заметку: частичный индекс
a IS NOT NULLможет быть использован в любых запросах с колонкой a, кроме запроса
a IS NULLПланировщик будет учитывать такой индекс в запросах, где используется условие на эту колонку.
Да, еще: будте осторожнее с отрицанием. Про de morgan law я писал вот тут https://t.me/nosingularity/513.
Если коротко: булево отрицание не всегда есть то, что вы себе предполагаете. И некоторые конструкции SQL не эквивалентны, хотя кажется, что должны:
A IS TRUEи
A = TRUEне одно и тоже!
2. Одновременно существует индекс на всю колонку и частичный индекс на эту же колонку.
При вставке и обновлении этой колонки будут обновляться оба индекса.
По понятной причине такие операции будут жрать довольно много ресурсов. Поэтому стоит хорошо подумать: нужен ли вам индекс по всей колонке, если уже есть частичный.
Btw, частично с обнаружением таких спорных мест помогает holistic.dev :)