我有一个大表和查询,由非索引列排序。 我这样做是为了声明一个游标,因为我需要用于分页的行,这意味着前面的第一行是N行,然后是后面的N行。
DECLARE cur CURSOR FOR select col1,col2 from table order by col2;
我知道Sql Server可以优化以快速提供前N行,因为如果我说TOP(N),那么它会非常快地返回,例如:
DECLARE cur CURSOR FOR select TOP(@N) col1,col2 from table order by col2;
我已经读过,我可以要求服务器快速提供前N行,所以我已经尝试过了:
DECLARE cur CURSOR FOR select TOP(@N) col1,col2 from table order by col2 OPTION (FAST @N);
不幸的是没有效果,即它没有提示那么慢。 为什么? 怎么解决?
答案 0 :(得分:3)
FAST
选项在您应用它的查询中没有任何区别。
它会产生任何差异的查询通常会有几个不同的连接,因此查询规划器将有一些不同的选择来检索数据。加入数据时,总体上会有更快的方式,以及快速返回第一行但整体速度较慢的方法。如果为存在这些选项的查询指定FAST
选项,则查询计划程序将选择更快地返回第一行的查询计划程序。
当您对一个总是很慢的非索引列进行排序时,因为必须先读取整个表,然后才能返回第一行。添加索引实际上是使查询更快的唯一方法。