2012-08-22 23 views
1

有谁知道为什么这部作品在约1秒:的Sybase视图查询 - 硬编码值的作品,但变量无法

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参数超时)

回答

0

当您具有硬编码值时,查询优化器可以选择可能的最佳计划。 由于查询优化器不知道该值可能是什么,所以当值为变量时不会发生这种情况。

现在你可以做的是创造一个指数为KY_TO_STP列,prolly你是一个非聚集:

create nonclustered index on QTS_LOAD_INFO(KY_TO_STP) 

您可以添加unique如果你想在KY_TO_STP每个值是唯一的,你可以替换nonclustered通过clustered如果KY_TO_STP是一个主键,或者如果你可以用它唯一地标识每一行(但不要忘记每个表只能有一个聚簇索引)。

+0

这是有道理的......我认为文本替换发生,但你说查询发送变量? – anthonybell

0

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

+0

我正在使用qwerybuilder。我也在一个C#项目中使用ibatis。 – anthonybell

+0

尝试使用交互式sql运行它(它位于sybase中心)。你会确定代码是正确的。也许是格式问题:多于一个空格或不正确的行尾。我有时在输入时遇到问题,没有正确输入。我不知道ibatis,所以我无法帮助你。 – Parado

+0

@ParadoX你说的是不是解决方案,它应该是在评论。 –

相关问题