2017-07-24 78 views
0

我想知道是否有方法可以优化n提高此存储过程的性能。我相当新的&将不胜感激您的帮助。如何优化存储过程

这个程序我继承了前面的程序员。

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spDailyWorkConfB]  
    @datew DATETIME 
AS 
BEGIN 
    SET NOCOUNT ON; 

    ;WITH tmpTable AS 
    (
     SELECT IdRealizare,Adresa, CONVERT(char(2), Data, 108) as Ora 
     FROM Butoane 
     WHERE (IdRealizare <> 0) AND (DAY(butoane.Data) = DAY(@datew)) AND (MONTH(butoane.Data) = MONTH(@datew)) AND (YEAR(butoane.Data) = YEAR(@datew)) 
    ) 

    SELECT *, COUNT(*) AS Qty INTO #tblOne 
    FROM tmpTable 
    GROUP BY IdRealizare,Adresa,Ora 
    HAVING COUNT(*) >=1 
    ORDER BY Ora 

    SELECT Masini.Linie , Masini.CodMasina, Operatii.CodOperatie, Angajati.Angajat, Comenzi.NrComanda,Articole.Articol, 
      OperatiiArticol.BucatiButon,Operatii.Operatie,OperatiiArticol.BucatiOra, Masini.Grup, #tblone.Ora, #tblOne.Qty, Realizari.Id, Operatii.PozRaport, Angajati.IdSector, Realizari.LastWrite, 
      Articole.Stagione 

    INTO #tblFOR 
      FROM Realizari 
         INNER JOIN Masini ON Realizari.IdMasina = Masini.Id 
         INNER JOIN Angajati ON Realizari.IdAngajat = Angajati.Id 
         INNER JOIN Comenzi ON Realizari.IdComanda = Comenzi.Id 
         INNER JOIN Operatii ON Realizari.IdOperatie = Operatii.Id 
         INNER JOIN Articole ON Comenzi.IdArticol = Articole.Id 
         INNER JOIN OperatiiArticol ON Comenzi.IdArticol = OperatiiArticol.IdArticol AND Operatii.id = OperatiiArticol.IdOperatie  
         INNER JOIN #tblOne ON #tblOne.IdRealizare=Realizari.Id 

    SELECT * FROM #tblFOR WHERE Qty>0 AND IdSector='1' AND Linie in ('LINEA1','LINEA2','LINEA3','LINEA4','LINEA5','LINEA6','LINEA7','LINEA8','LINEA9','LINEA10','LINEA11','LINEA12') ORDER BY Realizari.Id 
END 

如果有人有一些想法,我希望听到。 谢谢,最好的问候。

回答

0

一个提示是你应该在你的连接查询中使用WITH(NOLOCK)。因为这个过程基本上是为了显示数据而建立的。所以,当其他查询在这些表上执行更新时,您可能会获得未提交的数据,而不是创建死锁。