繁体   English   中英

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

[英]How to improve SQL query performance with a lot of inner selects?

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

我需要 select 客户、供应商或联系人的姓名、地址、电话等,具体取决于EntityID ( EntidadeID )

  • 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 所有字段的案例,但没有成功。

你需要做这样的事情:正如@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM