Problema like em 3.000 caracteres e 56 mi de registros
Ultimamente tenho problemas em uma base de dados, onde tenho que armazenar um dado de 3000 caracteres em um campo.
O problema não é o armazenamento e sim a consulta. Procurei ajuda, tentei índices e etc. Nada resolve, pois em um banco com mais de 56 milhões de registros, fazer um like em uma tabela com vários joins e num campo com 3000 caracteres, não há índice que melhore.
Pensei em uma solução. Só que está ficando inviável devido ao número alto de subselects.
Alguma idéia?
Tentei separar em palavras chaves, só que para fazer o like é inviável. Uso Mysql ou PostgreSQL.
Tabela: patente
>
Campos: cod Integer Auto-increment Primary Key
numero Varchar(14) NOT NULL UNIQUE INDEX
Tabela: resumo_patentes
>
Campos: cod Integer Auto-increment Primary Key
cod_palavra_resumo Integer NOT NULL Foreing Key References palavra_resumo(cod)
cod_patente Integer NOT NULL Foreing Key References patente(cod)
Tabela: palavra_resumo
>
Campos: cod Integer Auto-increment Primary Key
palavra Varchar(50) NOT NULL UNIQUE INDEX
O Resumo de uma patente é em média 3000 caracteres. Para armazená-lo eu quebro os espaços em um array de palavras e cada palavra é armazenada em palavra_resumo. Cada vez que vou armazenar uma palavra, verifico se ela já existe, caso não exista insiro os dados, se existe seleciono e depois recupero o seu código para armazená-lo em resumo_patentes. Cada palavra é armazenada na ordem de ocorrência que foi encontrada, se foi encontrada duas vezes, insiro seu código duplicado em resumo_patentes, de acordo com sua ocorrência.
Exemplos de Aplicação:
Patente: PI0567098-4
Resumo: Aplicação voltada para confinamento de exceção de metais. Aplicação de Estratégias comerciais.
Dados:
patente
>
cod numero
1 PI0567098-4
resumo_patentes
>
cod cod_palavra_resumo cod_patente ordem
1 1 1 1
2 2 1 2
3 3 1 3
4 4 1 4
5 5 1 5
6 6 1 6
7 5 1 7
8 7 1 8
9 1 1 9
10 5 1 10
11 8 1 11
12 9 1 12
palavra_resumo
>
cod palavra
1 Aplicação
2 voltada
3 para
4 confinamento
5 de
6 exceção
7 metais.
8 Estratégias
9 comerciais.
SQL:
SQL: procurar um número de patente executando like com “Aplicação voltada para confinamento”
select p.numero from
patente p inner join resumo_patentes r
on p.cod=r.cod_patente
inner join palavra_resumo pr
on r.cod_palavra_resumo=pr.cod
where
r.cod in(select resumo_patentes.cod from
patente inner join resumo_patentes
on patente.cod=resumo_patentes.cod_patente
inner join palavra_resumo
on resumo_patentes.cod_palavra_resumo=palavra_resumo.cod
where
palavra_resumo.palavra in(select palavra from palavra_resumo where palavra like '%Aplicação%' order by palavra asc) group by patente.numero,resumo_patentes.cod asc)
and (r.cod+1) in(select resumo_patentes.cod from
patente,resumo_patentes,palavra_resumo
where
patente.cod=p.cod and resumo_patentes.cod_patente=patente.cod and resumo_patentes.cod_palavra_resumo=palavra_resumo.cod and
palavra_resumo.palavra='voltada' group by resumo_patentes.cod asc)
and (r.cod+2) in(select resumo_patentes.cod from
patente,resumo_patentes,palavra_resumo
where
patente.cod=p.cod and resumo_patentes.cod_patente=patente.cod and resumo_patentes.cod_palavra_resumo=palavra_resumo.cod and
palavra_resumo.palavra='para' group by resumo_patentes.cod asc)
and (r.cod+3) in(select resumo_patentes.cod from
patente,resumo_patentes,palavra_resumo
where
patente.cod=p.cod and resumo_patentes.cod_patente=patente.cod and resumo_patentes.cod_palavra_resumo=palavra_resumo.cod and
palavra_resumo.palavra='confinamento' group by resumo_patentes.cod asc)
group by p.numero ascDiscussão (10)
Carregando comentários...