Замедляя рутину - PullRequest
0 голосов
/ 13 июня 2019

У меня есть цикл 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...