Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá galera
estou com um grande problema.
tenho uma view e estou fazendo um filtro por string, só que está muito lento, alguem sabe como aumentar a performace?
exemplo prático do código:
select * from view_teste where nome='mateushim'
vlw
at+
>
Tentou um indice
create index nome_indice on tabela ([nome])
select * from view_teste (index=nome_indice nolock) where nome='mateushim'
na view o nome é formado pela concatenação de 2 campos de tabelas diferentes que já possuem indice.
Desculpe, esqueci de completar sobre ser os indices na view..
Não sei sua estrutura de dados, mas uma ideia seria separar os campos pelo seus respectivos indices e usar temporarias para deixar a tabela menor
e ai sim criar tudo em execução um campo concatenado.
Jogue para dentro de uma temporaria tudo com um insert/select * tabela (indice) where campo='valor' e tentar com duas tabelas menores
Ou invés de selecionar, deletar <> 'VALOR' dentro de uma tempoaria, o SQL trata um pouco mais rapido.
Só estou te dando idéias, porque já fiz melhora de performace assim.
Já fez o plano de execução da query da view ?
O que ele faz ?
O BD tem estatisticas atualizadas ?
O fato de uma coluna ter índice não quer dizer que o otimizador de consultas use-o.
Exemplo, índice por SEXO , tabela de 5.000.000 de registros, 50% de distribuição para
cada sexo, o otimizador vai ver que o FULL SCAN é "mais barato".
SELECT NOME,DATANASC
FROM TABELA
WHERE SEXO = 'F'
Faça utilizando like
select * from view_teste where nome like '%mateushim'
fica mais rápido. Se você utilizar % a frente da palavra ele busca pela palavra exata.
Outra coisa importante. Crie indexação para esta tabela em sua base. Se for um grande volume de dados é interessante utilizar o PAD_INDEX = ON com um percentual especificado no FILLFACTOR. O que não foi o meu caso no exemplo abaixo. Importante também usar índices clusterizados dependendo da situação.
ALTER TABLE [dbo].[EntradaEstoque] ADD PRIMARY KEY CLUSTERED
(
[cd_empresa] ASC,
[cd_filial] ASC,
[nr_lote] ASC,
[nr_linha] ASC,
[cd_produto] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Tentou um indice
create index nome_indice on tabela ([nome])
select * from view_teste (index=nome_indice nolock) where nome='mateushim'