如何通过大量内部选择来提高SQL查询性能?

时间:2020-10-07 20:07:25

标签: sql performance select subquery case

如何更改此SQL查询以提高性能?

我需要根据EntityIDEntidadeID)从客户,供应商或联系人中选择姓名,地址,电话等

  • EntidadeID = 1Clients表中获取数据
  • EntidadeID = 2Supplier表中获取数据
  • EntidadeID = 3Contacts表中获取数据

SQL代码:

CREATE VIEW [dbo].[View_AtivTecnicasAtivTecnicasMatSer]
AS
    SELECT        
        a.Numero, a.UserFullName, a.Data, a.Hora, a.CodigoTerceiro, 
        a.Contacto, a.Tarefa, a.UserTarefaNome, a.AFaturar, a.Resolvido, 
        a.AgendadaData, a.AgendadaHora, a.AlertaData, a.AlertaHora, 
        a.Execucao, a.NotasInternas, a.ResolvidoData, a.ResolvidoHora, 
        a.ResolvidoUserFullName, a.NumeroAtendInicial, a.EmailCliente, 
        a.EmailUserTarefa, a.PDFTarefaAnexo, a.DataNotifInformativa, 
        a.DataNotifResolucao, a.TipoDoc, a.UserTarefaAlertado, 
        a.Origem, a.Anulado, a.TotalSIVA, a.TotalCIVA, a.Moeda, a.Cambio, 
        a.TaxaDesconto, a.TipoPreco, dbo.WR_Temas.Descricao, 
        CASE 
           WHEN EntidadeID = 1 THEN
                             (SELECT        Descricao
                               FROM            dbo.WR_ClientesEstab
                               WHERE        ID = a.ClienteEstabID) 
        END AS Estab, 
        CASE 
           WHEN a.EntidadeID = 1 THEN
                             (SELECT        Morada
                               FROM            dbo.WR_ClientesEstab
                               WHERE        ID = a.ClienteEstabID) 
           WHEN a.EntidadeID = 2 THEN
                             (SELECT        Morada
                               FROM            dbo.WR_Fornecedores
                               WHERE        Codigo = a.CodigoTerceiro) 
        END AS Morada, 
        CASE 
           WHEN a.EntidadeID = 1 THEN
                             (SELECT        Localidade
                               FROM            dbo.WR_ClientesEstab
                               WHERE        ID = a.ClienteEstabID) 
           WHEN a.EntidadeID = 2 THEN
                             (SELECT        Localidade
                               FROM            dbo.WR_Fornecedores
                               WHERE        Codigo = a.CodigoTerceiro) 
        END AS Localidade, 
        CASE 
           WHEN a.EntidadeID = 1 THEN
                             (SELECT        CodPostal
                               FROM            dbo.WR_ClientesEstab
                               WHERE        ID = a.ClienteEstabID) 
           WHEN a.EntidadeID = 2 THEN
                             (SELECT        CodPostal
                               FROM            dbo.WR_Fornecedores
                               WHERE        Codigo = a.CodigoTerceiro) 
        END AS CodPostal, CASE WHEN a.EntidadeID = 1 THEN
                             (SELECT        Telefone
                               FROM            dbo.WR_ClientesEstab
                               WHERE        ID = a.ClienteEstabID) END AS TelefoneEstab, CASE WHEN a.EntidadeID = 1 THEN
                             (SELECT        Telemovel
                               FROM            dbo.WR_ClientesEstab
                               WHERE        ID = a.ClienteEstabID) END AS TelemovelEstab, CASE WHEN a.EntidadeID = 1 THEN
                             (SELECT        Nome
                               FROM            dbo.WR_Clientes
                               WHERE        Codigo = a.CodigoTerceiro) WHEN a.EntidadeID = 2 THEN
                             (SELECT        Empresa
                               FROM            dbo.WR_Contactos
                               WHERE        ID = a.TerceiroID) WHEN a.EntidadeID = 3 THEN
                             (SELECT        Nome
                               FROM            dbo.WR_Fornecedores
                               WHERE        Codigo = a.CodigoTerceiro) END AS NomeTerceiro, CASE WHEN a.EntidadeID = 1 THEN
                             (SELECT        Telefone
                               FROM            dbo.WR_Clientes
                               WHERE        Codigo = a.CodigoTerceiro) WHEN a.EntidadeID = 2 THEN
                             (SELECT        Telefone
                               FROM            dbo.WR_Contactos
                               WHERE        ID = a.TerceiroID) WHEN a.EntidadeID = 3 THEN
                             (SELECT        Telefone
                               FROM            dbo.WR_Fornecedores
                               WHERE        Codigo = a.CodigoTerceiro) END AS Telefone, CASE WHEN a.EntidadeID = 1 THEN
                             (SELECT        Telemovel
                               FROM            dbo.WR_Clientes
                               WHERE        Codigo = a.CodigoTerceiro) WHEN a.EntidadeID = 2 THEN
                             (SELECT        Telemovel
                               FROM            dbo.WR_Contactos
                               WHERE        ID = a.TerceiroID) WHEN a.EntidadeID = 3 THEN
                             (SELECT        Telemovel
                               FROM            dbo.WR_Fornecedores
                               WHERE        Codigo = a.CodigoTerceiro) END AS Telemovel, CASE WHEN a.EntidadeID = 1 THEN
                             (SELECT        Contribuinte
                               FROM            dbo.WR_Clientes
                               WHERE        Codigo = a.CodigoTerceiro) WHEN a.EntidadeID = 2 THEN
                             (SELECT        Contribuinte
                               FROM            dbo.WR_Contactos
                               WHERE        ID = a.TerceiroID) WHEN a.EntidadeID = 3 THEN
                             (SELECT        Contribuinte
                               FROM            dbo.WR_Fornecedores
                               WHERE        Codigo = a.CodigoTerceiro) END AS Contribuinte, m.Linha, m.ArtigoCod, m.ArtigoDesc, m.Qtd, m.UN, m.ValorUnitario, m.DescontoPercentual, m.DescontoValor, m.Armazem, m.NumSerie, m.AnoERP, m.SerieERP, 
                         m.TipoDocERP, m.NumDocERP, m.DataExportadoERP, m.UserExportouERP, m.TaxaIva, m.TotalDescontos AS TotalDescontosLinha, m.TotalGeral AS TotalGeralLinhas, m.Ordenacao, m.ExportadaERP, m.DocERP, 
                         m.DescontoPercentual2, m.DescontoPercentual3, a.TotalMercadoria, a.TotalLiquido, a.TotalIVA, a.TotalGeral, a.TotalGeralEuros, a.TotalDescontosLinhas, a.TotalDescontosGlobal, a.TotalDescontos, a.EntidadeID, 
                         m.DescontoPercentual4
FROM            dbo.WR_AtivTecnicas AS a INNER JOIN
                         dbo.WR_Temas ON a.TemaID = dbo.WR_Temas.ID INNER JOIN
                         dbo.WR_AtivTecnicasMatSer AS m ON a.Numero = m.NumeroAtiv
GO

我尝试仅在所有字段中创建3个Select Cases,但没有成功。

1 个答案:

答案 0 :(得分:0)

您需要执行以下操作: 如@jarlh所述,您可以在有左连接的情况下替换您的选择,也因为您已经制定了以下规则:

EntidadeID = 1 gets data from Clients table
EntidadeID = 2 gets data from Supplier table
EntidadeID = 3 gets data from Contacts table

您可以将它们包括在加入条件中,因此可以完全删除个案,如下所示:

SELECT
    *
     -- instead of case for example for Telemovel
    , COALESCE( ct.Telemovel, st.Telemovel, cts.Telemovel)
    -- replace all the case statements following above logic
FROM
    dbo.WR_AtivTecnicas                  AS A
    INNER JOIN dbo.WR_Temas
        ON A.TemaID = dbo.WR_Temas.ID
    INNER JOIN dbo.WR_AtivTecnicasMatSer AS m
        ON A.Numero = m.NumeroAtiv
    LEFT OUTER JOIN ClientsTable ct
      ON  ct.Codigo = a.CodigoTerceiro -- replace with proper condition
      AND EntidadeID = 1
    LEFT OUTER JOIN SupplierTable st
      ON  st.id = A.id  -- replace with proper condition
      AND EntidadeID = 2
    LEFT OUTER JOIN ContactsTable cts
      ON  cts.ID = a.TerceiroID  -- replace with proper condition 
      AND EntidadeID = 3