Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle:pesquisa de texto completo com condição


Texto Oracle

1 - Você pode melhorar o desempenho criando o índice CONTEXT com FILTER BY:
create index my_idx on my_table(text) indextype is ctxsys.context filter by group_id;

Nos meus testes o filter by definitivamente melhorou o desempenho, mas ainda era um pouco mais rápido usar apenas um índice btree em group_id.

2 - Os índices CTXCAT usam "sub-índices" e parecem funcionar de forma semelhante a um índice de várias colunas. Esta parece ser a opção (4) que você está procurando:
begin
  ctx_ddl.create_index_set('my_table_index_set');
  ctx_ddl.add_index('my_table_index_set', 'group_id');
end;
/

create index my_idx2 on my_table(text) indextype is ctxsys.ctxcat
    parameters('index set my_table_index_set');

select * from my_table where catsearch(text, 'blah', 'group_id = 43') > 0

Esta é provavelmente a abordagem mais rápida. Usar a consulta acima em 120 MB de texto aleatório semelhante ao seu cenário A e B exigiu apenas 18 obtenções consistentes. Mas, no lado negativo, a criação do índice CTXCAT levou quase 11 minutos e usou 1,8 GB de espaço.

(Observação:o Oracle Text parece funcionar corretamente aqui, mas não estou familiarizado com o Text e não posso garantir que esse não seja um uso inadequado desses índices, como disse @NullUserException.)

Índices de várias colunas x junções de índice

Para a situação que você descreve em sua edição, normalmente não haveria uma diferença significativa entre usar um índice em (A,B) e juntar índices separados em A e B. Eu construí alguns testes com dados semelhantes aos que você descreveu e uma junção de índice exigia apenas 7 obtenções consistentes versus 2 obtenções consistentes para o índice de várias colunas.

A razão para isso é porque o Oracle recupera dados em blocos. Um bloco geralmente tem 8K e um bloco de índice já está classificado, então você provavelmente pode ajustar os valores de 500 a 2000 em alguns blocos. Se você está preocupado com o desempenho, geralmente o IO para ler e escrever blocos é a única coisa que importa. Se o Oracle precisa ou não juntar alguns milhares de linhas é uma quantidade inconsequente de tempo de CPU.

No entanto, isso não se aplica a índices Oracle Text. Você pode unir um índice CONTEXT com um índice btree (um "bitmap e"?), mas o desempenho é ruim.