我有一个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)
答案 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行,但统计信息已过期,则查询优化器将执行全表扫描,以确保它没有返回错误的结果。