在减慢常规速度的同时

时间:2019-06-13 15:17:27

标签: sql sql-server tsql

我有一个while循环,似乎在减慢我的代码的速度。当我运行提供的代码时,很长时间不打印任何内容,然后以非常快的速度运行了大约30倍,然后又停止运行。

如果我没有运行查询就很快,而如果我尝试运行迭代,查询就会发生上述情况。


--LOOP
DECLARE @i int = 1

While @i <= 5

--(SELECT COUNT(*)
--                  FROM Pedido)

BEGIN


SELECT 1


--DECLARE @i int = 1
--Temporary table with stock number
IF object_id ('tempdb..#ESTOQUE_UPDATE') is not null DROP TABLE #ESTOQUE_UPDATE
SELECT DISTINCT 
    P.Item
    ,(Qtd_Estoques - Qtd_Pedida) AS Qtd_Estoques
INTO 
    #ESTOQUE_UPDATE
    FROM #PEDIDO_RN W
    INNER JOIN Pedido P
        ON W.Pedido = P.Pedido
    INNER JOIN Estoque E
        ON P.Item = E.Item
    where 
        W.Id = 1


SET @i = @i+1
END

编辑1 我将添加整个代码以显示为什么使用循环


--SELECT *
--  FROM Pedido P
--  INNER JOIN Estoque E
--  ON P.Item = E.Item
--  ORDER BY P.Prioridade_Calc ASC

DROP TABLE Pedidos_completos
CREATE TABLE Pedidos_completos
(
    Pedido VarChar(MAX)
)

-- Bota em ordem os pedidos e coloca na table temporária #PEDIDO_RN

IF object_id ('tempdb..#PEDIDO_RN') is not null DROP TABLE #PEDIDO_RN
SELECT
    ROW_NUMBER() OVER (ORDER BY P.Prioridade_Calc) AS Id
    ,P.Prioridade_Calc
    ,P.Pedido
INTO #PEDIDO_RN
    FROM
    Pedido P
    GROUP BY P.Prioridade_Calc , P.Pedido
    ORDER BY P.Prioridade_Calc


SELECT * FROM #PEDIDO_RN
    ORDER BY Id


--LOOP
DECLARE @i int = 1

While @i <= SELECT COUNT(*)
                FROM Pedido

BEGIN


--Tabela temporaria com o novo número de estoque
IF object_id ('tempdb..#ESTOQUE_UPDATE') is not null DROP TABLE #ESTOQUE_UPDATE
SELECT DISTINCT 
    P.Item
    ,(Qtd_Estoques - Qtd_Pedida) AS Qtd_Estoques
INTO 
    #ESTOQUE_UPDATE
    FROM #PEDIDO_RN W
    INNER JOIN Pedido P
        ON W.Pedido = P.Pedido
    INNER JOIN Estoque E
        ON P.Item = E.Item
    where 
        W.Id = @i

SELECT * FROM #ESTOQUE_UPDATE   
--Verifica se não existem negativos
DECLARE @flag int
            SET @flag = CASE 
                WHEN (SELECT MIN (E.Qtd_Estoques)
                    FROM #ESTOQUE_UPDATE E) < 0 
                THEN 0
                ELSE 1
            END


--Atualiza a tablea de estoque
IF @flag = 1
    BEGIN
    UPDATE E
        SET
            E.Qtd_Estoques = U.Qtd_Estoques
        FROM Estoque E
            INNER JOIN #ESTOQUE_UPDATE U
            ON E.Item = U.Item
    END


--Adiciona pedidos dem pedidos completos    
IF @flag = 1 
        BEGIN

            INSERT INTO Pedidos_completos 
                SELECT 
                    Pedido
                FROM    #PEDIDO_RN

        WHERE Id = @i
        END

SET @i = @i+1

END


SELECT * FROM Pedidos_completos
SELECT * FROM #ESTOQUE_UPDATE
SELECT * FROM Estoque

在表格结构下方

CREATE TABLE Pedido 
(
    Pedido VarChar(MAX)
    ,Produto VarChar(MAX)
    ,Item VarChar(MAX)
    ,Prioridade_Calc VarChar(MAX)
    ,Valor_Total_Pedido VarChar(MAX)
    ,Qtd_Pedida VarChar(MAX)
    ,Aglutinacao_Calc VarChar(MAX)
    ,Valor_Minimo VarChar(MAX)

)

ALTER TABLE Pedido
    ALTER COLUMN Valor_Total_Pedido float

ALTER TABLE Pedido
    ALTER COLUMN Valor_Minimo   float

ALTER TABLE Pedido
    ALTER COLUMN Qtd_Pedida   int


ALTER TABLE Pedido
    ALTER COLUMN Prioridade_Calc   int



CREATE TABLE Estoque
(
    Item VarChar(MAX)
    ,Qtd_Estoques VarChar(MAX)

)

ALTER TABLE Estoque
    ALTER COLUMN Qtd_Estoques int

0 个答案:

没有答案