Se eu tiver uma coluna de texto name
com um agrupamento, por exemplo tr-TR
, e executar uma consulta
SELECT * FROM t WHERE name LIKE 'a%'
então isso fará uma varredura seq.
Se eu agora criar um índice
CREATE INDEX ON t(name text_pattern_ops)
a consulta acima se tornará uma varredura de bitmap. Mas há outra técnica que alcançará o mesmo resultado:
CREATE INDEX ON t(name COLLATE "C")
Essas abordagens são completamente equivalentes ou existem diferenças?
O manual:
Assim, o índice com
COLLATE "C"
faz tudo o que atext_pattern_ops
faria, mais o que o último não pode fazer. Como apoiar esta consulta:COLLATE "C"
deve ser especificado explicitamente na consulta para tornar oCOLLATE "C"
índice aplicável (a menos que você opere com o agrupamento "C" para começar, mas por que o índice?)A consulta acima requer o recurso de "suporte de agrupamento por coluna" (assim como seu índice). O recurso foi adicionado com o Postgres 9.1 . A classe de operadores
text_pattern_ops
é muito mais antiga e fazia muito sentido antes do Postgres 9.1.Desde o Postgres 9.1, a variante COLLATE "C" é superior , pois é mais versátil. A única razão que eu poderia pensar seria intencionalmente não suportar casos de uso adicionais por algum motivo estranho. O manual pode realmente adicionar um aviso de descontinuação para as classes de operadores
xxx_pattern_ops
. Bem, e as consultas podem usar umtext_pattern_ops
sem adicionarCOLLATE "C"
no lugar certo.