使用庞大的表优化Sql Server中的查询

时间:2018-02-19 14:06:46

标签: sql-server

这是我的第一个问题,所以如果出现任何故障,我会提前道歉。我找了一个答案,但找不到符合我目前情况的任何东西。我有这个SP显示如下,但问题在于“tmpBusca”表,这可能是一个巨大的数据(在这种情况下,它是大约2000万条记录)。我已经考虑过使用临时表来优化它,但正如你所看到的那样,并没有真正有效的过滤器,因为它可以是id或者根本没有。 提前谢谢。

    CREATE PROCEDURE [dbo].[sp_filtraEstoque]  
(  
 @Fornecedor int =null,  
 @Linha int = null,  
 @CodEstoquePrincipal int  = null,  
 @CodProduto int  = null,  
 @Nomeproduto varchar(200) =  null,  
 @qtdeEstoque bit = null,  
 @medida varchar(200) =null  
)  
AS  
 BEGIN  

        SELECT  EstoqueProdutoConf.Produto AS Codigo, 
            EstoqueProdutoConf.Codigo AS Codigo2,
            EstoqueProdutoConf.PrecoConf, 
            Produto.Nome AS ProdutoNome, 
            Produto.PrecoCusto,
            Produto.PrecoVenda,
            Produto.Disponibilidade, 
            Produto.Estoque,
            Fornecedor.Nome AS Fornecedor,
            Linha.Nome AS Linha,   
            EstoqueProdutoConf.Acabamento,
            EstoqueProdutoConf.Tecido, 
            EstoqueProdutoConf.Cor,
            EstoqueProdutoConf.Configuracao4, 
            EstoqueProdutoConf.Almoxarifado,   
            EstoqueProdutoConf.Quantidade,
            Produto.Medida, 
            EstoqueProdutoConf.Disponibilidade AS Expr1,
            EstoqueProdutoConf.PrevEntrega, 
            EstoqueProdutoConf.Oc,   
            EstoqueProdutoConf.QuantidadeDemonstracao, 
            EstoqueProdutoConf.CodEstoquePrincipal  
    FROM EstoqueProdutoConf
         INNER JOIN Produto ON EstoqueProdutoConf.Produto = Produto.Codigo
         INNER JOIN Fornecedor ON Produto.Fornecedor = Fornecedor.Codigo
         INNER JOIN Linha ON Produto.Linha = Linha.Codigo
         LEFT OUTER JOIN tmpBusca ON EstoqueProdutoConf.Produto = tmpBusca.Produto
                                 AND EstoqueProdutoConf.Acabamento = tmpBusca.Configuracao1
                                 AND EstoqueProdutoConf.Tecido = tmpBusca.Configuracao2
                                 AND EstoqueProdutoConf.Cor = tmpBusca.Configuracao3
                                 AND EstoqueProdutoConf.Configuracao4 = tmpBusca.Configuracao4  
    WHERE (Fornecedor.Codigo = @Fornecedor OR @Fornecedor is null)   
      AND (Produto.Linha = @Linha OR @Linha is null)  
      AND (EstoqueProdutoConf.CodEstoquePrincipal = @CodEstoquePrincipal OR @CodEstoquePrincipal is null)   
      AND (CONVERT(varchar(20), tmpBusca.id) = @CodProduto OR @CodProduto is null)   
      AND (Produto.Nome LIKE '%' + @Nomeproduto + '%' OR @Nomeproduto is null)   
      AND (@qtdeEstoque is null OR EstoqueProdutoConf.Quantidade<>0)  
      AND (@medida is null OR produto.Medida  like '%' + @medida + '%' )  
    ORDER BY Fornecedor.nome  

END   

0 个答案:

没有答案