SQL查询奇数行为:使用两个变量执行时永不结束
我一直在对一个SQL存储过程进行故障排除,该存储过程一直挂起并且没有完成执行。我将问题简化为声明的两个变量。下面显示的SQL查询是存储过程的一个片段。下面是我执行的测试用例场景SQL查询奇数行为:使用两个变量执行时永不结束,sql,sql-server,Sql,Sql Server,我一直在对一个SQL存储过程进行故障排除,该存储过程一直挂起并且没有完成执行。我将问题简化为声明的两个变量。下面显示的SQL查询是存储过程的一个片段。下面是我执行的测试用例场景 将WHERE子句中的@startver和@endver替换为56,它起作用了。查询在不到一秒钟内完成 将WHERE子句中的@endver替换为@饥饿者,它成功了。查询在不到一秒钟内完成 在WHERE子句中将@饥饿者替换为@endver,它起了作用。查询在不到一秒钟内完成 当这两个变量放在一起时,它不起作用。它一直在显
- 将WHERE子句中的@startver和@endver替换为56,它起作用了。查询在不到一秒钟内完成
- 将WHERE子句中的@endver替换为@饥饿者,它成功了。查询在不到一秒钟内完成
- 在WHERE子句中将@饥饿者替换为@endver,它起了作用。查询在不到一秒钟内完成
DECLARE @startver int = 56, @endver int = 56
SELECT
Z_Prodver.ProdverID ProdverID,
Prod.ProdName,
Z_Prodver.Releasedver,
Z_DNameLen.Z_DName Z_DName,
Z_DItemOffsets.Offset DItemOffset,
Z_DNameLen.Offset DNameIndex,
(Z_FormType.storagesize * M.ASize * DItem.ASize *
CASE DType.grouped
WHEN 0 THEN 1
ELSE 8
END
) AllocationSize,
H_NAME()
FROM
Z_Prodver,
Prod,
DItem,
DType,
M,
Z_DNameLen,
Z_DItemOffsets,
ProdPerM,
Z_ProdSupport,
Form,
Z_FormType
WHERE
DItem.ProdverID >= @startver
AND DItem.ProdverID <= @endver
AND DItem.DName = Z_DNameLen.DName
AND DType.DTypeName = DItem.DTypeName
AND DType.ProdverID = DItem.ProdverID
AND M.MName = DItem.MName
AND M.ProdverID = DItem.ProdverID
AND M.MName = ProdPerM.MName
AND M.ProdverID = ProdPerM.ProdverID
AND ProdPerM.ProdverID = Z_Prodver.ProdverID
AND Z_DItemOffsets.ProdverID = Z_Prodver.ProdverID
AND Prod.ProdName = ProdperM.ProdName
AND Z_DItemOffsets.DName = DItem.DName
AND Form.FormName = DItem.FormName
AND Z_FormType.FormTypeName = Form.FormTypeName
AND Form.ProdverID = DItem.ProdverID
AND Z_DItemOffsets.HostName = H_NAME()
AND Z_ProdSupport.ProdverID = M.ProdverID
AND Z_ProdSupport.ProdName= Prod.ProdName
AND Z_ProdSupport.PCSupport = 1
声明@startver int=56,@endver int=56
挑选
这是一个很好的例子,
Prod.ProdName,
Z_Prodver.Releasedver,
Z_DNameLen.Z_DName Z_DName,
Z_ditemofset.Offset ditemofset,
Z_DNameLen.Offset DNameLen索引,
(Z_FormType.storagesize*M.ASize*DItem.ASize*
CASE DType.grouped
当0时,则为1
其他8
结束
)分配,
H_NAME()
从…起
Z_Prodver,
戳
迪特姆,
数据类型,
M
Z_DNameLen,
Z_Ditemofsets,
前胚乳,
Z_ProdSupport,
形式,
Z_型
哪里
DItem.ProdverID>=@startver
和DItem.ProdverID=@startversion
和DataItem.ProductVersionID
但是整个查询需要使用适当的连接进行重写,使用上述解决方法将从选项(重新编译)
或转换为使用动态sql中获益匪浅
参考:
今日提示:切换到现代的显式JOIN
语法!更易于编写(无错误),更易于阅读和维护,并且在需要时更易于转换为外部联接。(1)修复查询以使用正确的显式join
语法。(2) 请尝试存储过程中的“重新编译”选项。问题可能是执行计划的缓存。这不是问题的答案,但您确实应该使用ANSI-92样式的连接。他们已经存在超过25年了。尝试在存储过程中使用“重新编译”。存储过程尝试使用的计划可能不是最有效的。3条评论也这么说-几秒钟之内!(我打败了快速输入Gordon!)这个存储过程是在2002年编写的。我会重新写一遍,看看进展如何。非常感谢。@JC203很乐意帮忙!
DECLARE @startversion int = 56, @endversion int = 56
SELECT
PC_ProductVersion.ProductVersionID AS ProductVersionID,
Product.ProductName,
PC_ProductVersion.ReleasedVersion,
PC_DataNameLengths.PC_DataName AS PC_DataName,
PC_DataItemOffsets.Offset AS DataItemOffset,
PC_DataNameLengths.Offset AS ataNameIndex,
(PC_FormatType.storagesize * Module.ArraySize * DataItem.ArraySize *
CASE DataType.grouped
WHEN 0 THEN 1
ELSE 8
END
) AllocationSize,
HOST_NAME()
FROM DataItem
INNER JOIN PC_DataNameLengths
ON DataItem.DataName = PC_DataNameLengths.DataName
INNER JOIN DataType
ON DataType.DataTypeName = DataItem.DataTypeName
AND DataType.ProductVersionID = DataItem.ProductVersionID
INNER JOIN Module
ON Module.ModuleName = DataItem.ModuleName
AND Module.ProductVersionID = DataItem.ProductVersionID
INNER JOIN ProductPerModule
ON ProductPerModule.ProductVersionID = Module.ProductVersionID
AND ProductPerModule.ModuleName = Module.ModuleName
INNER JOIN PC_DataItemOffsets
ON PC_DataItemOffsets.DataName = DataItem.DataName
AND PC_DataItemOffsets.HostName = HOST_NAME()
INNER JOIN PC_ProductVersion
ON PC_ProductVersion.ProductVersionID = PC_DataItemOffsets.ProductVersionID
AND PC_ProductVersion.ProductVersionID = ProductPerModule.ProductVersionID
INNER JOIN Product
ON Product.ProductName = ProductperModule.ProductName
INNER JOIN Format
ON Format.FormatName = DataItem.FormatName
AND Format.ProductVersionID = DataItem.ProductVersionID
INNER JOIN PC_ProductSupport
ON PC_ProductSupport.ProductVersionID = Module.ProductVersionID
AND PC_ProductSupport.ProductName= Product.ProductName
AND PC_ProductSupport.PCSupport = 1
INNER JOIN PC_FormatType
ON PC_FormatType.FormatTypeName = Format.FormatTypeName
WHERE
DataItem.ProductVersionID >= @startversion
AND DataItem.ProductVersionID <= @endversion
DItem.ProdverID >= @startver AND DItem.ProdverID <= @endver
and 1 = case when @startver = @endver and DItem.ProdverID <> @startver
then 0
else 1
end