Estou usando o postgres 9.5
Se eu tiver uma tabela com 2 colunas assim:
CREATE TABLE mystuff
(
somestring character varying(256),
timestamp_ timestamp without time zone NOT NULL
)
Esse índice de árvore b de várias colunas:
CREATE INDEX mystuff_idx
ON mystuff
USING btree
(timestamp_ , somestring varchar_pattern_ops);
ajuda no desempenho da seguinte consulta?
Select count(*)
FROM mystuff
where timestamp_ > '01/01/2012' and somestring like 'foo%'
A respeito ?
Select count(*)
FROM mystuff
where timestamp_ > '01/01/2012' and somestring like '%foobar'
Para um ponto extra, explique como uma btree multicoluna é usada para pesquisa quando há uma cláusula semelhante na segunda (ou terceira etc...) coluna do índice.
O índice btree de duas colunas ajudará na
like 'foo%'
consulta, mas provavelmente não de forma dramática. Isso ajuda porque pode ser executado como uma varredura somente de índice e, portanto, pode calcular a parte LIKE dentro do índice sem nunca ter que visitar a tabela. A varredura de índice saltará para a primeira entrada > '01/01/2012' e, em seguida, passará de lá para o final lógico do índice. A cada entrada, ele testará a condição LIKE. Para aqueles que passarem por essa condição, ele verificará o mapa de visibilidade para ver se a página da tabela que contém essa tupla está toda visível. Se estiver tudo visível, ele incrementará o contador e seguirá em frente. Caso contrário, ele terá que visitar a página da tabela para ver se a tupla está visível.O quanto isso ajudará é difícil de prever, pois depende do tamanho do índice, da tabela, da sua RAM, da combinação de consultas que você está executando (o que altera o tipo de dados que provavelmente será encontrado no cache), entre outras coisas.
Não ajudará com a consulta `like '%foobar'. Do lado de fora, olhando para dentro, não há razão para que não possa ajudar da mesma maneira. Mas a maquinaria de indexação do PostgreSQL ainda não foi suficientemente inteligente (ainda) para reconhecer e implementar essa possibilidade.