SQL Server:查询性能分析-是否有优化想法?

威尔·马库勒

我已经阅读了多篇推荐使用SQL Server Profiler的文章,我也是。

我有一个非常重要的查询,它会使应用程序不时冻结。该查询包含多个LEFT JOIN ... ON ... AND (... AND ...) OR (... AND ...)

我对正在使用的关系模型没有任何权限,因此我必须使用它。

该查询是关于在发生火灾时将附近的危险产品放置在附近,以帮助计划消防员的干预计划。该查询有效,只需要进行一些优化即可。

现在,我有这个疑问有6635 Reads296 CPU0 Writes281 Duration

我所能想到的就是查询速度太慢,可能对于服务器而言太重了。换句话说,它根本不是最佳的。

万一这很重要,因为我相信确实如此,因此查询在where子句中具有多个计算,例如:

ATN2(SQRT(SIN(RADIANS(@latitude - CASE WHEN LocationType = @locationType THEN Buildings.Latitude ELSE Intersections.Latitude END) / 2 *...

我没有预算购买任何工具。

更新

根据请求,这是可怕的查询:

SELECT PHM.ID, HP.Name, PHMD.TL, PHMD.QTY
    , PHMD.CT, PHMD.C, PHMD.MU
    , HP.HR, HP.FR, HP.RR, HP.SR
    , PHMD.CP
    , A.HN, A.Alpha
    , CASE WHEN PHM.LT <> @7 THEN TL.D ELSE TL.D + ' ' + TL2.D END AS TLcol
    , C.D AS CD
FROM PHM 
    LEFT JOIN PHMD ON PHMD.ExID = PHM.ID 
    LEFT JOIN HP ON PHMD.HPID = HP.ID 
    LEFT JOIN BP ON PHM.LT=@5 
        AND BP.ID = PHM.BPID 
    LEFT JOIN A ON (PHM.LT=@4 
            AND A.ID = PHM.AID) 
        OR (PHM.LT=@5 
            AND BP.AID = A.ID) 
    LEFT JOIN I ON I.ID = PHM.IID  
    LEFT JOIN TL ON (PHM.LT<>@7 
            AND A.TLID = TL.ID) 
        OR (PHM.LT=@7 
            AND I.TLID1 = TL.ID)  
    LEFT JOIN TL AS TL2 ON PHM.LT=@7 
        AND I.TLID2 = TL2.ID 
    LEFT JOIN C ON TL.CID=C.ID 
    LEFT JOIN B ON A.ID = B.ExID 
    LEFT JOIN B ON B.ID = B.BID 
WHERE EXISTS (SELECT * FROM PHMD WHERE PHMD.ExID=PHM.ID)
    AND (((PHM.LT=@4 AND PHM.AID=@8)    
        OR (PHM.LT=@5 AND PHM.BPID IN (SELECT ID FROM BP WHERE AID=@8)) 
    OR (PHM.LT=@6 AND PHM.BID IN (SELECT BID FROM B WHERE ExID=@8))) 
     AND PHM.DV = (
            SELECT MAX(PHMLD.DV) 
                FROM PHM AS PHMLD 
                WHERE PHMLD.LT = PHM.LT 
                    AND ISNULL(PHMLD.AddressID,0) = ISNULL(PHM.AID,0) 
                    AND ISNULL(PHMLD.SuiteID,0) = ISNULL(PHM.SID,0) 
                    AND ISNULL(PHMLD.BPID,0) = ISNULL(PHM.BPID,0) 
                    AND ISNULL(PHMLD.IID,0)=ISNULL(PHM.IID,0) 
                    AND ISNULL(PHMLD.BID,0)=ISNULL(PHM.BID,0)) 
                    OR 6371010 * (2 * ATN2(
                            SQRT((SIN(RADIANS(@1 - CASE WHEN PHM.LT<>@6 THEN B.LAT ELSE I.LAT END)/2) 
                                * SIN(RADIANS(@1 - CASE WHEN PHM.LT<>@6 THEN B.LAT ELSE I.LAT END)/2) 
                                + COS(RADIANS(CASE WHEN PHM.LT<>@6 THEN B.LAT ELSE I.LAT END)) 
                                * COS(RADIANS(@1)) 
                                * SIN(RADIANS(@2 - CASE WHEN PHM.LT<>@6 THEN B.LNG ELSE I.LNG END)/2) 
                                * SIN(RADIANS(@2 - CASE WHEN PHM.LT<>@6 THEN B.LNG ELSE I.LNG END)/2)))
                            , SQRT(1-(SIN(RADIANS(@1 - CASE WHEN PHM.LT<>@6 THEN B.LAT ELSE I.LAT END)/2) 
                                * SIN(RADIANS(@1 - CASE WHEN PHM.LT<>@6 THEN B.LAT ELSE I.LAT END)/2) 
                                + COS(RADIANS(CASE WHEN PHM.LT<>@6 THEN B.LAT ELSE I.LAT END)) 
                                * COS(RADIANS(@1)) 
                                * SIN(RADIANS(@2 - CASE WHEN PHM.LT<>@6 THEN B.LNG ELSE I.LNG END)/2) 
                                * SIN(RADIANS(@2 - CASE WHEN PHM.LT<>@6 THEN B.LNG ELSE I.LNG END)/2))))
                        ) <= @3)

SET SHOWPLAN_XML ON 更新

请访问以下链接获取执行展示计划。http://pastebin.com/k6GxxSKF

多谢您的协助!=)

南皮比

查看查询执行计划,我可以看到在连接上花费的时间最多LEFT OUTER。查询计划显示73%的查询时间/资源花费在该连接上。

您是否需要左外部连接?

大多数查询使用索引查找并返回很少的行,这与它获得的一样好。但是,他们使用的NESTED LOOP联接不是最有效的JOIN类型。我怀疑如果您强制使用MERGE甚至HASH连接类型,您可能会看到不同的性能。请参阅此链接,了解如何强制使用另一种类型的JOIN不过,实际上并不建议这样做。

这些表是否经常更新?还是它们很静态?这些表中还有多少数据。我怀疑如果SQL Server使用错误的JOIN类型,则可能是表上的统计信息已过时。尝试UPDATE STATISTICS在表上运行,然后检查查询计划是否更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL查询性能优化

来自分类Dev

SQL Server查询:联合与独立联合所有性能

来自分类Dev

大型查询的SQL Server性能

来自分类Dev

SQL Server嵌套查询性能

来自分类Dev

SQL Server 查询性能测试

来自分类Dev

SQL Server:如何提高WHERE子句中具有多个CTE和子查询的查询的性能

来自分类Dev

重写SQL查询以优化性能

来自分类Dev

通过 SQL Server 提高 SQL 查询的性能

来自分类Dev

优化SQL Server 2012查询

来自分类Dev

优化SQL Server聚合查询

来自分类Dev

优化SQL Server 2012查询

来自分类Dev

SQL Server中的查询优化

来自分类Dev

SQL Server 排名查询优化

来自分类Dev

优化我的 SQL Server 查询

来自分类Dev

有效的SQL Server 2005查询优化

来自分类Dev

有效的SQL Server 2005查询优化

来自分类Dev

是否优化 select max(date) sql 查询?

来自分类Dev

相关嵌套查询的查询优化(SQL Server)

来自分类Dev

带有子查询的SQL查询优化

来自分类Dev

如何提高SQL Server Select查询的性能?

来自分类Dev

如何提高SQL Server Select查询的性能?

来自分类Dev

如何提高此SQL Server查询的性能?

来自分类Dev

SQL Server的查询性能调优

来自分类Dev

SQL Server 并发查询性能下降

来自分类Dev

流分析是否支持输出到 SQL Server 内存优化表?

来自分类Dev

具有UNION优化的SQL查询

来自分类Dev

具有游标优化的SQL查询

来自分类Dev

具有游标优化的SQL查询

来自分类Dev

SQL Server 索引 - 想法?