Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

sr.silva

Otimizar SP

Recommended Posts

Pessoal,

 

Surgiu a necessidade de unificar duas sp´s bem complexas aqui.

Ou seja, se já tenho 2 terei mais 1 com um índice de complexidade bem extremo.. hehehe

 

 

Pergunta. É possível otimizar um SELECT com 10 tabelas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pergunta. É possível otimizar um SELECT com 10 tabelas?

Sim e Não.

Depende do resultado do plano de execução, tipo (e se tiver) índices, quantidade de registros nas tabelas e a serem filtrados, leitura de disco (I/O), Collation entre base e aplicação, onde estas procedures são aplicadas (Relatórios em RP, Crystal, Excel, etc...) e por ai vai.... tem muitas variáveis, porem eu começaria pelo plano de execução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim..

O plano de execução é o primeiro passo..

 

Porém antes desse 1º passo criei aqui o passo 0º heheh =)

 

veja a mensagem:

All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

 

Tanta a SP[A] quanto a SP tem 26 colunas cada, óbvio que na [A] eu tive que criar na mão.. o famoso '' as coluna_igual_B

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que usar null e mais valido do que " ", e questão de otimizar query dá sim, desde que os campo estejam indexados e você use o Index para otimizar a query pode ter 10 ou 20 tabelas que não será problema retorno será rápido.

 

Uma coisa dependendo é valido colocar isso dentro de uma View (visão), para nao ficar rodando essa select toda hora no banco e deixar que banco se encarregue de ocupar um espaço em memoria com essa select

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pergunta. É possível otimizar um SELECT com 10 tabelas?

 

Depende :

Qtd de linhas das tabelas.

Estatísticas atualizadas ou não.

Existem ou podem existir índices

Qtd de linhas que se espera no retorno

 

O passo zero é conhecer os relacionamentos das tabelas

O passo um é rodar o Plano de Execução da query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

 

> número igual de expressões não seria exatamente número igual de campos, certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim , num UNION o número, ordem e tipos das colunas dos selects devem coincidir

 

isto não pode

 

select cgc, nome
from fornecedor
union
select cgc.nome,telefone
from cliente

isto pode

 

 

 

select cgc, nome , telefone
from fornecedor
union
select cgc.nome,telefone
from cliente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, com relação a campos de tipos diferentes, pode sim:

Olhe este exemplo:

declare @fornecedor table (nome varchar(30), telefone numeric(11,0))declare @cliente table (nome varchar(50), cpf varchar(11)) insert into @fornecedor values ('a.jr', 11980807966)insert into @cliente values ('a.jr', '11111111111') select nome,telefone from @fornecedorunion allselect nome, cpf from @cliente 
Resultaado:

 

nome telefone
a.jr 11980807966
a.jr 11111111111

 

srsilva, acho que falta é campo neste seu UNION.
Ambos os selects tem que 26 CAMPOS.

Compartilhar este post


Link para o post
Compartilhar em outros sites

De fato mas os campos precisam ser conversíveis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigos..as duas consultas tem 26 campos.

 

acredito que o item.. tipos de campo diferentes possa ser o problema..

Compartilhar este post


Link para o post
Compartilhar em outros sites

De fato mas os campos precisam ser conversíveis.

 

 

amigos..as duas consultas tem 26 campos.

 

acredito que o item.. tipos de campo diferentes possa ser o problema..

 

@Motta, sim, isso sim. Tem que ser campos que possuem conversão direta, mas se colocar tudo NULL não pode ter erro.

 

@srsilva, tem como postar o resultado das suas consultas separadamente e os tipos de cada campo?

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

vejam o cenário..

Antes desse SELECT tem uma consulta gigante para formar a tabela #T1.

Depois disso temos..

 

SELECT
a.*, NULL AS CODANEXO,
(CASE WHEN (ISNULL(TIPL,'') IN('P','N')) THEN 'SEM CORRESPONDENTE'
WHEN (ISNULL(TIPIA,'') IN('','F')) THEN c.NOMFILIAL
ELSE b.NOMFORN END) AS RESP
NULL AS AVALIACAO,
NULL AS ARQUIVO
FROM #T1 a
LEFT JOIN F35 b WITH(NOLOCK) ON b.CODFORN = a.REFERATD AND a.TIPL = 'C'
LEFT JOIN R01 c WITH(NOLOCK) ON a.CODFILIAL = c.CODFILIAL
LEFT JOIN A06 d WITH(NOLOCK) ON d.CODAGENDA = a.REFERATD AND a.TIP = 'F'
LEFT JOIN S01 e WITH(NOLOCK) ON d.CODUSERRECEP = e.ID
ORDER BY a.DATAFATAL DESC 

 

 

Isso repete para a SP ela é formada do mesmo modo acima..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.