Sybase视图查询 - 硬编码值有效但变量失败

时间:2012-08-22 14:47:39

标签: tsql sybase ibatis

有谁知道为什么这会在大约1秒内发挥作用:

select Q.USR_LOAD_NBR from QUAD0066..QTS_LOAD_INFO Q where Q.KY_TO_STP = 2142870

但这需要超过10秒(最多5分钟):

declare @groupId int
set @groupId = 2142870
select Q.USR_LOAD_NBR from QUAD0066..QTS_LOAD_INFO Q where Q.KY_TO_STP = @groupId

我遇到了与ibatis完全相同的问题,除了ibatis在15秒内超时并导致我的代码失败。 (硬编码不到1秒,使用int参数超时)

2 个答案:

答案 0 :(得分:0)

你有错误吗? 您是否使用不同的程序运行此代码(例如ase isql和interactive sql)?

答案 1 :(得分:0)

当您对值进行硬编码时,查询优化器可以选择最佳计划。 当值是变量时不会发生这种情况,因为查询优化器不知道该值是什么。

现在你可以做的是为KY_TO_STP列创建一个索引,你很可能是非聚集的:

create nonclustered index on QTS_LOAD_INFO(KY_TO_STP)

如果您希望unique中的每个值都是唯一的,则可以添加KY_TO_STP,如果nonclustered是主键,您可以clustered替换KY_TO_STP或者如果你可以使用它来单独识别每一行(但不要忘记每个表只能有一个聚集索引)。