Возможно ли использовать селективный индекс, имея два условия "not is distinct from "?
Условия задачи:
in_StorePlaceID is not null
coalesce(in_PhysicalArticleID,in_ContainerID) is not null
(in_PhysicalArticleID is null or in_ContainerID is null) = true
Запрос:
select SPI.StorePlaceItemID
from StorePlaceItems as SPI
where SPI.StorePlaceID = in_StorePlaceID
and not SPI.PhysicalArticleID is distinct from in_PhysicalArticleID
and not SPI.ContainerID is distinct from in_ContainerID
План:
Bitmap Heap Scan on storeplaceitems spi (cost=1806.44..34794.78 rows=1 width=4) (actual time=51.394..51.736 rows=1 loops=1)
Recheck Cond: ((storeplaceid)::integer = 332)
Filter: ((NOT ((physicalarticleid)::integer IS DISTINCT FROM NULL::integer)) AND (NOT ((containerid)::integer IS DISTINCT FROM 3034602)))
Rows Removed by Filter: 70831
-> Bitmap Index Scan on i_storeplaceitems_storeplace (cost=0.00..1806.44 rows=76534 width=0) (actual time=15.217..15.217 rows=70834 loops=1)
Index Cond: ((storeplaceid)::integer = 332)
Total runtime: 51.775 ms
Селективность по StorePlaceID низкая, но индексы по PhysicalArticleID, ContainerID разного рода никогда не используются.
Поскольку это фрагмент функции pl/pgsql, несложно проверить, какой из двух in_PhysicalArticleID, in_ContainerID not null, и применить явный запрос. В этом случае используется селективный индекс по StorePlaceID, PhysicalArticleID, ContainerID. План идеальный. Технически проблема решена.
Но есть ли способ получить оптимальный план, используя исходную конструкцию из двух not is distinct from?