Tsql sql查询性能

Tsql sql查询性能,tsql,Tsql,在我的查询中我遇到了性能问题我需要一些技巧来提高性能我和工会一起尝试过,但只赢了一秒钟 在运行SQL Server profiler时执行它。然后保存输出,并将其插入数据库引擎优化顾问。这将为您提供索引和统计信息的想法当然,在不知道表、索引、主键等详细信息的情况下优化查询并不简单 但从你的查询来看,这太复杂了。我想你应该从头开始。但以下是一些可以帮助您的提示: 在查询中有许多子查询和join,但只使用一个名为GoodsEvent的表。想想看,你真的需要这些连接和子查询吗?如果您确实认为需要,请

在我的查询中我遇到了性能问题我需要一些技巧来提高性能我和工会一起尝试过,但只赢了一秒钟


在运行SQL Server profiler时执行它。然后保存输出,并将其插入数据库引擎优化顾问。这将为您提供索引和统计信息的想法

当然,在不知道表、索引、主键等详细信息的情况下优化查询并不简单

但从你的查询来看,这太复杂了。我想你应该从头开始。但以下是一些可以帮助您的提示:

在查询中有许多子查询和join,但只使用一个名为GoodsEvent的表。想想看,你真的需要这些连接和子查询吗?如果您确实认为需要,请尝试将结果放入临时表并与临时表联接。然后可以在查询的其他部分重用该临时表

查询的第3部分和第4部分:与GoodEvents表进行内部联接,在其中计算min EventOn,但从未在主查询中使用此结果。因此,子查询的使用似乎没有什么用处

尝试为您的表找到不同的alliase,将所有的alliase命名为相同的名称会使操作变得复杂

在整个查询过程中都使用表GGE。这个GGE表是在查询的第一部分中创建的,但是在第3和第4部分中重用了它,请重新考虑。你不能把它放在临时桌上吗

我希望这些技巧能对您有所帮助,但正如前面所说的,如果没有更多细节,几乎不可能修改此查询。也许你可以发布你的查询执行计划

或者,如果您发送给我您创建goodsEvent表的脚本和您想要的结果,那么我可以尝试编写它

问候
盖伊

你看过执行计划了吗?这将是一个很好的起点。@César:毁灭?:-你不应该——真的-
ELECT    GE.Id, V.Gid, V.EventOn, V.[Type], GE.SiteId, S.[$Refex] SiteRefex, V.Quantity, GE.IsIgnored
FROM         GoodsEvent GE INNER JOIN
                          (/* 2. SI que gerem Quantity  < 0*/ SELECT GE_SI_SO.Gid, GE_SI_SO.[Type], max(GE.EventOn) EventOn, GE_SI_SO.Quantity
                            FROM          GoodsEvent GE INNER JOIN
                                                       (SELECT     GGE.Gid, CASE WHEN SUM(GGE.Qtd) < 0 THEN 'SO' ELSE 'SI' END [Type], SUM(GGE.Qtd) Quantity
                                                         FROM          (SELECT     GE.Gid, CASE WHEN GE.[Type] = 'SI' THEN COUNT(GE.[Type]) ELSE 0 END nSI, 
                                                                                                        CASE WHEN GE.[Type] = 'SO' THEN COUNT(GE.[Type]) ELSE 0 END nSO, CASE WHEN GE.[Type] = 'SI' THEN SUM(GE.Quantity) 
                                                                                                        ELSE SUM(GE.Quantity) * - 1 END Qtd
                                                                                 FROM          GoodsEvent GE
                                                                                 WHERE      GE.IsDeleted = 0 AND GE.[Type] IN ('SI', 'SO')
                                                                                 GROUP BY GE.Gid, GE.[Type]) GGE
                                                         GROUP BY GGE.Gid
                                                         HAVING      SUM(GGE.nSI) > SUM(GGE.nSO) + 1 OR
                                                                                SUM(GGE.Qtd) < 0) GE_SI_SO ON GE.Gid = GE_SI_SO.Gid AND GE.[Type] = GE_SI_SO.[Type]
                            WHERE      GE.IsDeleted = 0
                            GROUP BY GE_SI_SO.Gid, GE_SI_SO.Quantity, GE_SI_SO.[Type]
                            UNION 
                            /* 1. Vários SI c/ ou s/ LO no meio*/ SELECT GE_BASE.Gid, 'SI' AS [Type], GE_Base.EventOn, 0 AS Quantity
                            FROM         (SELECT     ROW_NUMBER() OVER (ORDER BY GE.Gid, GE.EventOn) RowNumber, GE.Gid, GE.[Type], GE.EventOn
                            FROM         GoodsEvent GE
                            WHERE     GE.IsDeleted = 0) GE_BASE INNER JOIN
                          (SELECT     ROW_NUMBER() OVER (ORDER BY GE.Gid, GE.EventOn) RowNumber, GE.Gid, GE.[Type]
FROM         GoodsEvent GE
WHERE     GE.IsDeleted = 0) GE_O ON GE_BASE.Gid = GE_O.Gid AND 
GE_O.RowNumber = CASE GE_BASE.RowNumber WHEN 1 THEN 1 ELSE GE_BASE.RowNumber - 1 END
WHERE     GE_BASE.RowNumber <> GE_O.RowNumber AND GE_BASE.[Type] = GE_O.[Type] AND GE_BASE.[Type] = 'SI' AND GE_O.[Type] = 'SI'
UNION
/* 3. LO sem SI a preceder*/ SELECT GE.Gid, 'LO' [Type], GE.EventOn, 0 Quantity
FROM         GoodsEvent GE INNER JOIN
                          (SELECT     GE.Gid, MIN(GE.EventOn) EventOn
                            FROM          GoodsEvent GE
                            WHERE      GE.IsDeleted = 0
                            GROUP BY GE.Gid) GGE ON GE.Gid = GGE.Gid AND GE.EventOn = GGE.EventOn
/*WHERE     GE.[Type] = 'LO' AND GE.IsDeleted = 0*/ WHERE GE.[Type] <> 'SI' AND GE.IsDeleted = 0
UNION 
/*4. IG  Gids com Eventos de 'SI' Apos fecho de SiteIn */ SELECT GE.Gid, 'IG' [Type], GE.EventOn, 0 Quantity
FROM         GoodsEvent GE INNER JOIN
                          (SELECT     Gid, MIN(EventOn) AS EventOn
                            FROM          GoodsEvent AS GE
                            WHERE      GE.IsDeleted = 0
                            GROUP BY Gid) GGE ON GE.Gid = GGE.Gid AND GGE.EventOn = Ge.EventOn INNER JOIN
                      Goods G ON G.Gid = Ge.Gid INNER JOIN
                      SiteIn SI ON G.SiteIn = SI.[$Id] AND SI.Closed = 1 AND SI.ClosedOn < GE.EventOn
WHERE     GE.IsDeleted = 0) V ON GE.Gid = V.Gid AND GE.EventOn = V.EventOn AND GE.IsDeleted = 0 INNER JOIN
[Site] S ON S.[$Id] = GE.SiteId