Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
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
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
Coloquei NULL mas mesmo assim continua com esse erro..
Coloque UNION ALL, tendo em vista que você já colocou o mesmo número de campos.
sim..coloquei union all
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.
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?
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
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.
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..
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
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..
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.