Olá Pessoal. > > > >Estou passando por um problema sério numa consulta no ambiente de produção, a >mesma apresenta lentidão na sua utilização(praticamente todo o sistema a >utiliza), como não tenho experiência em Tunning de consulta, estou recorrendo >a ajuda de vocês. > > >Será que poderiam me ajudar a melhorar a consulta de forma que eu consiga ter >ganho de desempenho. > > >Como não tenho muita experiência em SQL, talvez com ajuda de vocês, seja >possível reescrever um SQL que foi mal escrito pelo desenvolvedor ou até mesmo >sugerir a criação índice. > > > > >Obs.: o script foi criado para T-SQL mas pelo que pude analisar, o que impacta >mesmo são as condições utilizadas como clausulas UNION, DISTINCT. Precisaria >mesmo de uma apoio para reescrever a consulta utilizando melhor a linguagem >SQL para optimizar a mesma. > > > >Toda ajuda é sempre bem vinda. >Desde já agradeço o apoio de sempre. ----------
CREATE PROCEDURE [dbo].[SP_AV_SELECT_MINHAS_AVALIACOES] ( @CPF VARCHAR(14) ) AS -- MINHAS AVALIAÇÕES SELECT COD_AVALIACAO, COD_CR_ASSOCIADO, COD_EMP_ASSOCIADO, DES_NOME_CARGO, COD_MODELO, ANO_APLICACAO, COD_STATUS, IDPESSOA, DAT_CRIACAO, USR_CRIACAO, DAT_ULT_ATUALIZACAO, USR_ULT_ATUALIZACAO, DAT_LIMITE_PREENCHIMENTO, DAT_CRIACAO_RELATORIO, USR_CRIACAO_RELATORIO, CPF_ASSOCIADO, RELATORIO_GERADO FROM DBO.AV_AVALIACAO WHERE (CPF_ASSOCIADO = @CPF) -- MINHAS AVALIAÇÕES UNION -- AVALIAÇÕES SUBORDINADOS SELECT DBO.AV_AVALIACAO.COD_AVALIACAO, DBO.AV_AVALIACAO.COD_CR_ASSOCIADO, DBO.AV_AVALIACAO.COD_EMP_ASSOCIADO, DBO.AV_AVALIACAO.DES_NOME_CARGO, DBO.AV_AVALIACAO.COD_MODELO, DBO.AV_AVALIACAO.ANO_APLICACAO, DBO.AV_AVALIACAO.COD_STATUS, DBO.AV_AVALIACAO.IDPESSOA, DBO.AV_AVALIACAO.DAT_CRIACAO, DBO.AV_AVALIACAO.USR_CRIACAO, DBO.AV_AVALIACAO.DAT_ULT_ATUALIZACAO, DBO.AV_AVALIACAO.USR_ULT_ATUALIZACAO, DBO.AV_AVALIACAO.DAT_LIMITE_PREENCHIMENTO, DBO.AV_AVALIACAO.DAT_CRIACAO_RELATORIO, DBO.AV_AVALIACAO.USR_CRIACAO_RELATORIO, DBO.AV_AVALIACAO.CPF_ASSOCIADO, DBO.AV_AVALIACAO.RELATORIO_GERADO FROM DBO.AV_QUESTIONARIO INNER JOIN DBO.AV_AVALIACAO ON DBO.AV_QUESTIONARIO.COD_AVALIACAO = DBO.AV_AVALIACAO.COD_AVALIACAO WHERE DBO.AV_QUESTIONARIO.COD_TIPO_QUESTIONARIO = 2 AND (DBO.AV_QUESTIONARIO.IDPESSOA IN (SELECT DBO.USUARIO_DADOS.IDPESSOA FROM DBO.USUARIO_DADOS WHERE CPF = @CPF AND IDPESSOA <> '')) -- AVALIAÇÕES SUBORDINADOS UNION -- AVALIAÇÕES QUESTIONÁRIOS PENDENTES SELECT DBO.AV_AVALIACAO.COD_AVALIACAO, DBO.AV_AVALIACAO.COD_CR_ASSOCIADO, DBO.AV_AVALIACAO.COD_EMP_ASSOCIADO, DBO.AV_AVALIACAO.DES_NOME_CARGO, DBO.AV_AVALIACAO.COD_MODELO, DBO.AV_AVALIACAO.ANO_APLICACAO, DBO.AV_AVALIACAO.COD_STATUS, DBO.AV_AVALIACAO.IDPESSOA, DBO.AV_AVALIACAO.DAT_CRIACAO, DBO.AV_AVALIACAO.USR_CRIACAO, DBO.AV_AVALIACAO.DAT_ULT_ATUALIZACAO, DBO.AV_AVALIACAO.USR_ULT_ATUALIZACAO, DBO.AV_AVALIACAO.DAT_LIMITE_PREENCHIMENTO, DBO.AV_AVALIACAO.DAT_CRIACAO_RELATORIO, DBO.AV_AVALIACAO.USR_CRIACAO_RELATORIO, DBO.AV_AVALIACAO.CPF_ASSOCIADO, DBO.AV_AVALIACAO.RELATORIO_GERADO FROM DBO.AV_QUESTIONARIO INNER JOIN DBO.AV_AVALIACAO ON DBO.AV_QUESTIONARIO.COD_AVALIACAO = DBO.AV_AVALIACAO.COD_AVALIACAO WHERE DBO.AV_QUESTIONARIO.STA_QUESTIONARIO = 1 AND (DBO.AV_AVALIACAO.COD_STATUS = 1) AND (DBO.AV_QUESTIONARIO.IDPESSOA IN (SELECT DBO.USUARIO_DADOS.IDPESSOA FROM DBO.USUARIO_DADOS WHERE CPF = @CPF AND IDPESSOA <> '')) -- AVALIAÇÕES QUESTIONÁRIOS PENDENTES UNION -- AVALIAÇÕES COM STATUS DEVOLUTIVA E SUPERIOR ATUAL DIFERENTE SELECT DISTINCT A.COD_AVALIACAO, A.COD_CR_ASSOCIADO, A.COD_EMP_ASSOCIADO, A.DES_NOME_CARGO, A.COD_MODELO, A.ANO_APLICACAO, A.COD_STATUS, A.IDPESSOA, A.DAT_CRIACAO, A.USR_CRIACAO, A.DAT_ULT_ATUALIZACAO, A.USR_ULT_ATUALIZACAO, A.DAT_LIMITE_PREENCHIMENTO, A.DAT_CRIACAO_RELATORIO, A.USR_CRIACAO_RELATORIO, A.CPF_ASSOCIADO, A.RELATORIO_GERADO FROM DBO.AV_QUESTIONARIO Q, DBO.AV_AVALIACAO A, DBO.USUARIO_DADOS U WHERE Q.COD_TIPO_QUESTIONARIO = 2 AND Q.STA_QUESTIONARIO = 2 AND Q.COD_AVALIACAO = A.COD_AVALIACAO AND A.COD_STATUS = 3 AND U.CPF = A.CPF_ASSOCIADO AND U.DATA_DEMISSAO IS NULL AND (U.IDPESSOA_SUPERIORIMEDIATO IN (SELECT UD.IDPESSOA FROM DBO.USUARIO_DADOS UD WHERE UD.CPF = @CPF AND UD.DATA_DEMISSAO IS NULL AND UD.IDPESSOA <> '')) ORDER BY ANO_APLICACAO DESC -- AVALIAÇÕES COM STATUS DEVOLUTIVA E SUPERIOR ATUAL DIFERENTE -- USUÁRIO SELECT USUARIO_PK, EMPRESA_FK, PERFIL_FK, NOME_USUARIO, MATRICULA, CENTRO_RESULTADO, NOME_CARGO, EMAIL, DATA_DEMISSAO, CPF, DATA_NASC, RG, DATA_ADMISSAO, ENDERECO, TELEFONE_COMERCIAL, TELEFONE_CELULAR, PASSAPORTE, IDPESSOA_SUPERIORIMEDIATO, IDPESSOA, LOGIN, SENHA, ULTIMO_ACESSO, NUMERO_ACESSO, IDUSUARIO_FRAMEWORK FROM DBO.USUARIO_DADOS WHERE (CPF IN (SELECT U.CPF FROM DBO.USUARIO_DADOS U WHERE U.CPF = @CPF AND U.DATA_DEMISSAO IS NULL AND U.IDPESSOA <> '')) -- USUÁRIO UNION -- USUÁRIO SUBORDINADOS SELECT DBO.USUARIO_DADOS.USUARIO_PK, DBO.USUARIO_DADOS.EMPRESA_FK, DBO.USUARIO_DADOS.PERFIL_FK, DBO.USUARIO_DADOS.NOME_USUARIO, DBO.USUARIO_DADOS.MATRICULA, DBO.USUARIO_DADOS.CENTRO_RESULTADO, DBO.USUARIO_DADOS.NOME_CARGO, DBO.USUARIO_DADOS.EMAIL, (SELECT TOP 1 DATA_DEMISSAO FROM DBO.USUARIO_DADOS U WHERE U.CPF = DBO.USUARIO_DADOS.CPF ORDER BY DATA_DEMISSAO) AS DATA_DEMISSAO, DBO.USUARIO_DADOS.CPF, DBO.USUARIO_DADOS.DATA_NASC, DBO.USUARIO_DADOS.RG, DBO.USUARIO_DADOS.DATA_ADMISSAO, DBO.USUARIO_DADOS.ENDERECO, DBO.USUARIO_DADOS.TELEFONE_COMERCIAL, DBO.USUARIO_DADOS.TELEFONE_CELULAR, DBO.USUARIO_DADOS.PASSAPORTE, (SELECT TOP 1 IDPESSOA_SUPERIORIMEDIATO FROM DBO.USUARIO_DADOS U WHERE U.CPF = DBO.USUARIO_DADOS.CPF AND DATA_DEMISSAO IS NULL) AS IDPESSOA_SUPERIORIMEDIATO, DBO.USUARIO_DADOS.IDPESSOA, DBO.USUARIO_DADOS.LOGIN, DBO.USUARIO_DADOS.SENHA, DBO.USUARIO_DADOS.ULTIMO_ACESSO, DBO.USUARIO_DADOS.NUMERO_ACESSO, DBO.USUARIO_DADOS.IDUSUARIO_FRAMEWORK FROM DBO.AV_QUESTIONARIO INNER JOIN DBO.AV_AVALIACAO ON DBO.AV_QUESTIONARIO.COD_AVALIACAO = DBO.AV_AVALIACAO.COD_AVALIACAO INNER JOIN DBO.USUARIO_DADOS ON DBO.AV_AVALIACAO.IDPESSOA = DBO.USUARIO_DADOS.IDPESSOA WHERE DBO.AV_QUESTIONARIO.COD_TIPO_QUESTIONARIO = 2 AND (DBO.AV_QUESTIONARIO.IDPESSOA IN (SELECT DBO.USUARIO_DADOS.IDPESSOA FROM DBO.USUARIO_DADOS WHERE CPF = @CPF AND IDPESSOA <> '')) -- USUÁRIO SUBORDINADOS UNION -- USUÁRIO QUESTIONÁRIOS PENDENTES SELECT DBO.USUARIO_DADOS.USUARIO_PK, DBO.USUARIO_DADOS.EMPRESA_FK, DBO.USUARIO_DADOS.PERFIL_FK, DBO.USUARIO_DADOS.NOME_USUARIO, DBO.USUARIO_DADOS.MATRICULA, DBO.USUARIO_DADOS.CENTRO_RESULTADO, DBO.USUARIO_DADOS.NOME_CARGO, DBO.USUARIO_DADOS.EMAIL, (SELECT TOP 1 DATA_DEMISSAO FROM DBO.USUARIO_DADOS U WHERE U.CPF = DBO.USUARIO_DADOS.CPF ORDER BY DATA_DEMISSAO) AS DATA_DEMISSAO, DBO.USUARIO_DADOS.CPF, DBO.USUARIO_DADOS.DATA_NASC, DBO.USUARIO_DADOS.RG, DBO.USUARIO_DADOS.DATA_ADMISSAO, DBO.USUARIO_DADOS.ENDERECO, DBO.USUARIO_DADOS.TELEFONE_COMERCIAL, DBO.USUARIO_DADOS.TELEFONE_CELULAR, DBO.USUARIO_DADOS.PASSAPORTE, DBO.USUARIO_DADOS.IDPESSOA_SUPERIORIMEDIATO, DBO.USUARIO_DADOS.IDPESSOA, DBO.USUARIO_DADOS.LOGIN, DBO.USUARIO_DADOS.SENHA, DBO.USUARIO_DADOS.ULTIMO_ACESSO, DBO.USUARIO_DADOS.NUMERO_ACESSO, DBO.USUARIO_DADOS.IDUSUARIO_FRAMEWORK FROM DBO.AV_QUESTIONARIO INNER JOIN DBO.AV_AVALIACAO ON DBO.AV_QUESTIONARIO.COD_AVALIACAO = DBO.AV_AVALIACAO.COD_AVALIACAO INNER JOIN DBO.USUARIO_DADOS ON DBO.AV_AVALIACAO.IDPESSOA = DBO.USUARIO_DADOS.IDPESSOA WHERE DBO.AV_QUESTIONARIO.STA_QUESTIONARIO = 1 AND (DBO.AV_AVALIACAO.COD_STATUS = 1) AND (DBO.AV_QUESTIONARIO.IDPESSOA IN (SELECT DBO.USUARIO_DADOS.IDPESSOA FROM DBO.USUARIO_DADOS WHERE CPF = @CPF AND IDPESSOA <> '')) -- USUÁRIO QUESTIONÁRIOS PENDENTES UNION -- USUÁRIOS COM STATUS DEVOLUTIVA E SUPERIOR ATUAL DIFERENTE SELECT DISTINCT U.USUARIO_PK, U.EMPRESA_FK, U.PERFIL_FK, U.NOME_USUARIO, U.MATRICULA, U.CENTRO_RESULTADO, U.NOME_CARGO, U.EMAIL, (SELECT TOP 1 DATA_DEMISSAO FROM DBO.USUARIO_DADOS DD WHERE DD.CPF = U.CPF ORDER BY DATA_DEMISSAO) AS DATA_DEMISSAO, U.CPF, U.DATA_NASC, U.RG, U.DATA_ADMISSAO, U.ENDERECO, U.TELEFONE_COMERCIAL, U.TELEFONE_CELULAR, U.PASSAPORTE, U.IDPESSOA_SUPERIORIMEDIATO, U.IDPESSOA, U.LOGIN, U.SENHA, U.ULTIMO_ACESSO, U.NUMERO_ACESSO, U.IDUSUARIO_FRAMEWORK FROM DBO.AV_AVALIACAO A, DBO.USUARIO_DADOS U WHERE A.COD_STATUS = 3 AND U.CPF = A.CPF_ASSOCIADO AND U.DATA_DEMISSAO IS NULL AND (U.IDPESSOA_SUPERIORIMEDIATO IN (SELECT UD.IDPESSOA FROM DBO.USUARIO_DADOS UD WHERE UD.CPF = @CPF AND UD.DATA_DEMISSAO IS NULL AND UD.IDPESSOA <> '')) -- USUARIOS COM STATUS DEVOLUTIVA E SUPERIOR ATUAL DIFERENTE -- QUESTIONÁRIOS SUBORDINADOS SELECT DBO.AV_QUESTIONARIO.COD_QUESTIONARIO, DBO.AV_QUESTIONARIO.COD_TIPO_QUESTIONARIO, DBO.AV_QUESTIONARIO.COD_AVALIACAO, DBO.AV_QUESTIONARIO.STA_QUESTIONARIO, DBO.AV_QUESTIONARIO.DES_PONTOS_FORTES, DBO.AV_QUESTIONARIO.DES_PONTOS_MELHORAR, DBO.AV_QUESTIONARIO.DES_COMENTARIO, DBO.AV_QUESTIONARIO.DAT_INICIO_PREENCHIMENTO, DBO.AV_QUESTIONARIO.DAT_FIM_PREENCHIMENTO, DBO.AV_QUESTIONARIO.IND_ATIVO, DBO.AV_QUESTIONARIO.IDPESSOA FROM DBO.AV_QUESTIONARIO INNER JOIN DBO.AV_AVALIACAO ON DBO.AV_QUESTIONARIO.COD_AVALIACAO = DBO.AV_AVALIACAO.COD_AVALIACAO WHERE DBO.AV_QUESTIONARIO.COD_TIPO_QUESTIONARIO = 2 AND (DBO.AV_QUESTIONARIO.IDPESSOA IN (SELECT DBO.USUARIO_DADOS.IDPESSOA FROM DBO.USUARIO_DADOS WHERE CPF = @CPF AND IDPESSOA <> '')) -- QUESTIONÁRIOS SUBORDINADOS UNION -- QUESTIONÁRIOS PENDENTES SELECT DBO.AV_QUESTIONARIO.COD_QUESTIONARIO, DBO.AV_QUESTIONARIO.COD_TIPO_QUESTIONARIO, DBO.AV_QUESTIONARIO.COD_AVALIACAO, DBO.AV_QUESTIONARIO.STA_QUESTIONARIO, DBO.AV_QUESTIONARIO.DES_PONTOS_FORTES, DBO.AV_QUESTIONARIO.DES_PONTOS_MELHORAR, DBO.AV_QUESTIONARIO.DES_COMENTARIO, DBO.AV_QUESTIONARIO.DAT_INICIO_PREENCHIMENTO, DBO.AV_QUESTIONARIO.DAT_FIM_PREENCHIMENTO, DBO.AV_QUESTIONARIO.IND_ATIVO, DBO.AV_QUESTIONARIO.IDPESSOA FROM DBO.AV_QUESTIONARIO INNER JOIN DBO.AV_AVALIACAO ON DBO.AV_QUESTIONARIO.COD_AVALIACAO = DBO.AV_AVALIACAO.COD_AVALIACAO WHERE (STA_QUESTIONARIO = 1) AND (DBO.AV_AVALIACAO.COD_STATUS = 1) AND (DBO.AV_QUESTIONARIO.IDPESSOA IN (SELECT DBO.USUARIO_DADOS.IDPESSOA FROM DBO.USUARIO_DADOS WHERE CPF = @CPF AND IDPESSOA <> '')) -- QUESTIONÁRIOS PENDENTES UNION -- QUESTIONÁRIOS SUBORDINADOS COM STATUS DEVOLUTIVA E SUPERIOR ATUAL DIFERENTE SELECT DISTINCT Q.COD_QUESTIONARIO, Q.COD_TIPO_QUESTIONARIO, Q.COD_AVALIACAO, Q.STA_QUESTIONARIO, Q.DES_PONTOS_FORTES, Q.DES_PONTOS_MELHORAR, Q.DES_COMENTARIO, Q.DAT_INICIO_PREENCHIMENTO, Q.DAT_FIM_PREENCHIMENTO, Q.IND_ATIVO, Q.IDPESSOA FROM DBO.AV_QUESTIONARIO Q, DBO.AV_AVALIACAO A, DBO.USUARIO_DADOS U WHERE Q.COD_TIPO_QUESTIONARIO = 2 AND Q.STA_QUESTIONARIO = 2 AND Q.COD_AVALIACAO = A.COD_AVALIACAO AND A.COD_STATUS = 3 AND U.CPF = A.CPF_ASSOCIADO AND U.DATA_DEMISSAO IS NULL AND (U.IDPESSOA_SUPERIORIMEDIATO IN (SELECT UD.IDPESSOA FROM DBO.USUARIO_DADOS UD WHERE UD.CPF = @CPF AND UD.DATA_DEMISSAO IS NULL AND UD.IDPESSOA <> '')) -- QUESTIONÁRIOS SUBORDINADOS COM STATUS DEVOLUTIVA E SUPERIOR ATUAL DIFERENTE ORDER BY DBO.AV_QUESTIONARIO.COD_AVALIACAO DESC -- TIPO AVALIAÇÃO SELECT COD_TIPO_QUESTIONARIO, DES_TIPO_QUESTIONARIO FROM DBO.AV_TIPO_QUESTIONARIO -- TIPO AVALIAÇÃO -- EXERCÍCIO --SELECT USR_CRIACAO, DAT_CRIACAO, USR_DESATIVACAO, DAT_DESATIVACAO, IND_ATIVO, DES_EXERCICIO, ANO_APLICACAO, ANO_INICIO --FROM DBO.AV_EXERCICIO -- EXERCÍCIO GO [As partes desta mensagem que não continham texto foram removidas]