Eu me deparei com algo interessante ao trabalhar em uma migração em um aplicativo Rails:
Ao criar um índice parcial em um campo booleano IS
e =
na cláusula where, o índice parcial não é a mesma coisa.
Por exemplo:
Dada uma tabela products
com uma coluna booleana, counterfeit
criei um índice sobre falsificação com a restrição counterfeit = true
.
add_column :products, :counterfiet, :boolean
add_index :products, :id, algorithm: :concurrently, where: "(counterfiet = TRUE)"
Ele atinge o índice quando eu procuro usando o seguinte: SELECT * FROM "products" WHERE "products"."counterfeit" = TRUE
Selects usa o índice que acabei de criar.
No entanto, se consultar usando este próximo formulário, ele faz uma varredura sequencial:SELECT * FROM "products" WHERE "products"."counterfeit" IS TRUE
Para que funcione em qualquer um dos formulários, indexei usando o seguinte:
add_index :products, :id, algorithm: :concurrently, where: "(counterfiet = TRUE OR counterfiet IS TRUE)"
Agora, os dois formulários usam o índice!