SQL视图在某些参数上显着减慢

时间:2016-03-09 10:26:21

标签: sql sql-server-2008 view

我有一个SQL视图,因为我在其中一个参数上达到了更高的值,似乎停止了。

它似乎是FKID_Operation(来自tbl_Operations表)。如果我们搜索基本上高达1504的任何东西,这很好,但是一旦我们达到1505,它就会大幅减速。我无法想到为什么 - 该字段是一个常规的int,因此它应该能够获取该值(如果它不能,它不应该允许它,它就在那里)并且所有内容都正确索引。我认为问题在于尝试从tbl_Schedules表中检索记录 - 没有它就可以正常工作 - 但是再次,不能想到为什么。一切都存在并且正确,并且随后添加的值可以正常工作。

代码是:

SELECT     dbo.tbl_PhysicalAsset.PKID_PhysicalAsset, dbo.tbl_PhysicalAsset.FKID_Contract, dbo.tbl_PhysicalAsset.L1_Name, dbo.tbl_PhysicalAsset.L2_Name, 
                  dbo.tbl_PhysicalAsset.L3_Name, dbo.tbl_PhysicalAsset.Spare1, dbo.tbl_PhysicalAsset.Spare2, dbo.tbl_PhysicalAsset.Spare3, dbo.tbl_PhysicalAsset.Spare4, 
                  dbo.tbl_PhysicalAsset.Spare5, dbo.tbl_PhysicalAsset.Deleted AS Expr1, dbo.tbl_Operations.PKID_Operation, dbo.tbl_Operations.FKID_Operation AS WhatOp, 
                  dbo.tbl_Operations.FKID_Team, dbo.tbl_Operations.Deleted AS Expr2, dbo.tbl_Schedules.PKID_Schedule, dbo.tbl_Schedules.FKID_Operation, 
                  dbo.tbl_Schedules.SchedFrom, dbo.tbl_Schedules.SchedTo, dbo.tbl_Schedules.Deleted, CAST(dbo.tbl_Schedules.SchedFrom AS VARCHAR(11)) 
                  + ' to ' + CAST(dbo.tbl_Schedules.SchedTo AS VARCHAR(11)) AS Combined, YEAR(dbo.tbl_Schedules.SchedFrom) AS MyYear
FROM         dbo.tbl_Operations INNER JOIN
                  dbo.tbl_PhysicalAsset ON dbo.tbl_Operations.FKID_PhysicalAsset = dbo.tbl_PhysicalAsset.PKID_PhysicalAsset INNER JOIN
                  dbo.tbl_Schedules ON dbo.tbl_Operations.PKID_Operation = dbo.tbl_Schedules.FKID_Operation
GROUP BY dbo.tbl_Schedules.PKID_Schedule, dbo.tbl_Schedules.FKID_Operation, dbo.tbl_Schedules.SchedFrom, dbo.tbl_Schedules.SchedTo, 
                  CAST(dbo.tbl_Schedules.SchedFrom AS VARCHAR(11)) + ' to ' + CAST(dbo.tbl_Schedules.SchedTo AS VARCHAR(11)), dbo.tbl_PhysicalAsset.FKID_Contract, 
                  dbo.tbl_PhysicalAsset.L1_Name, dbo.tbl_PhysicalAsset.L2_Name, dbo.tbl_PhysicalAsset.L3_Name, dbo.tbl_PhysicalAsset.Spare1, dbo.tbl_PhysicalAsset.Spare2, 
                  dbo.tbl_PhysicalAsset.Spare3, dbo.tbl_PhysicalAsset.Spare4, dbo.tbl_PhysicalAsset.Spare5, dbo.tbl_Operations.FKID_Team, dbo.tbl_Operations.FKID_Operation, 
                  YEAR(dbo.tbl_Schedules.SchedFrom), dbo.tbl_Schedules.Deleted, dbo.tbl_PhysicalAsset.Deleted, dbo.tbl_Operations.Deleted, 
                  dbo.tbl_PhysicalAsset.PKID_PhysicalAsset, dbo.tbl_Operations.PKID_Operation
HAVING      (dbo.tbl_PhysicalAsset.Deleted = 0) AND (dbo.tbl_Operations.Deleted = 0) AND (dbo.tbl_PhysicalAsset.FKID_Contract = 58) AND 
                  (dbo.tbl_Operations.FKID_Operation = 1505)

1 个答案:

答案 0 :(得分:1)

我只是将having子句转换为where子句。

SELECT     dbo.tbl_PhysicalAsset.PKID_PhysicalAsset, dbo.tbl_PhysicalAsset.FKID_Contract, dbo.tbl_PhysicalAsset.L1_Name, dbo.tbl_PhysicalAsset.L2_Name, 
                  dbo.tbl_PhysicalAsset.L3_Name, dbo.tbl_PhysicalAsset.Spare1, dbo.tbl_PhysicalAsset.Spare2, dbo.tbl_PhysicalAsset.Spare3, dbo.tbl_PhysicalAsset.Spare4, 
                  dbo.tbl_PhysicalAsset.Spare5, dbo.tbl_PhysicalAsset.Deleted AS Expr1, dbo.tbl_Operations.PKID_Operation, dbo.tbl_Operations.FKID_Operation AS WhatOp, 
                  dbo.tbl_Operations.FKID_Team, dbo.tbl_Operations.Deleted AS Expr2, dbo.tbl_Schedules.PKID_Schedule, dbo.tbl_Schedules.FKID_Operation, 
                  dbo.tbl_Schedules.SchedFrom, dbo.tbl_Schedules.SchedTo, dbo.tbl_Schedules.Deleted, CAST(dbo.tbl_Schedules.SchedFrom AS VARCHAR(11)) 
                  + ' to ' + CAST(dbo.tbl_Schedules.SchedTo AS VARCHAR(11)) AS Combined, YEAR(dbo.tbl_Schedules.SchedFrom) AS MyYear
FROM         dbo.tbl_Operations INNER JOIN
                  dbo.tbl_PhysicalAsset ON dbo.tbl_Operations.FKID_PhysicalAsset = dbo.tbl_PhysicalAsset.PKID_PhysicalAsset INNER JOIN
                  dbo.tbl_Schedules ON dbo.tbl_Operations.PKID_Operation = dbo.tbl_Schedules.FKID_Operation
WHERE (dbo.tbl_PhysicalAsset.Deleted = 0) AND (dbo.tbl_Operations.Deleted = 0) AND (dbo.tbl_PhysicalAsset.FKID_Contract = 58) AND 
                  (dbo.tbl_Operations.FKID_Operation = 1505)
GROUP BY dbo.tbl_Schedules.PKID_Schedule, dbo.tbl_Schedules.FKID_Operation, dbo.tbl_Schedules.SchedFrom, dbo.tbl_Schedules.SchedTo, 
                  CAST(dbo.tbl_Schedules.SchedFrom AS VARCHAR(11)) + ' to ' + CAST(dbo.tbl_Schedules.SchedTo AS VARCHAR(11)), dbo.tbl_PhysicalAsset.FKID_Contract, 
                  dbo.tbl_PhysicalAsset.L1_Name, dbo.tbl_PhysicalAsset.L2_Name, dbo.tbl_PhysicalAsset.L3_Name, dbo.tbl_PhysicalAsset.Spare1, dbo.tbl_PhysicalAsset.Spare2, 
                  dbo.tbl_PhysicalAsset.Spare3, dbo.tbl_PhysicalAsset.Spare4, dbo.tbl_PhysicalAsset.Spare5, dbo.tbl_Operations.FKID_Team, dbo.tbl_Operations.FKID_Operation, 
                  YEAR(dbo.tbl_Schedules.SchedFrom), dbo.tbl_Schedules.Deleted, dbo.tbl_PhysicalAsset.Deleted, dbo.tbl_Operations.Deleted, 
                  dbo.tbl_PhysicalAsset.PKID_PhysicalAsset, dbo.tbl_Operations.PKID_Operation

还要确保所有表的统计信息都是最新的。如果您的查询返回0行,但统计信息已过期,则查询优化器将执行全表扫描,以确保它没有返回错误的结果。