目前,我发现在我们的应用程序一个查询及其执行计划“索引扫描”。好了,这里有一些背景:SQL Server 2005中执行计划的问题
- 它有三个列,类型为“idType :bigint“
- 手头上只有200件爆炸物品
- 有列(a:PK,b:FK,c:FK),我们有两个索引(一个聚簇索引(b,c),一个PK非聚集索引(a))
以下是我们的查询:
exec sp_executesql N'select b,a from table where b in (@P0, @P1, @P2,
@P3, @P4, @P5, @P6, @P7, @P8, @P9)',
N'@P0 bigint, @P1 bigint, @P2 bigint, @P3 bigint, @P4 bigint, @P5 bigint,
@P6 bigint, @P7 bigint, @P8 bigint, @P9 bigint',
94, 161, 4, 50, 166, 52, 53, 90, 100, 123
它从执行计划显示为pk索引上的“索引扫描”...出了什么问题?
如果我使用相同的查询,但不能使用“sp_executesql的”,如:
select b,a from table where b in(94,161,4,50,166,52,53,90,100,123)
它显示“聚集索引查找”如我所料
为什么会使用SQL Server“索引扫描”的第一个查询?它是否与函数 “sp_executesql”本身有关?
谢谢你在进阶 万斯
实际“CREATE TABLE”和“CREATE INDEX”语句比描述更容易理解(一般说明:只要删除多余的列,如果表格很宽,并且问题可以用列的子集来演示) – 2011-03-01 09:16:27
尝试在存储过程中执行代码,查看执行计划是否与sp_execute或T-SQL计划相同将会很有趣。 (这不一定是解决您的问题,我只是想获得更多信息) – Tony 2011-03-01 09:53:37
谢谢大家的回复! @Tony我把第一个查询'exec sp_executesql N'...)在一个SP中,并得到“index_scan”相同。这个问题涉及到我的测试表的值是小的吗?我只有200个项目,所以sql服务器不会“优化”它的查询执行吗? – Vance 2011-03-01 10:03:08