日期:2014-05-19  浏览次数:20358 次

表的索引为何不起作用了?
今天遇到个非常奇怪的问题

我有一个表叫PP_Orders   只有一个关键字的索引,CompanyID   升,DocType   升,DocNo   降

当在查询分析器里边使用Select   *   from   PP_Orders   进行查询的时候数据却未按索引的顺序显示出来,而是乱七八糟的。 于是我把数据库备份下来放到另一台机做试验,结果完全正确。

最后重启错误的SQL服务器,解决问题。


虽然问题解决了,但是什么原因导致这样却仍然没有搞懂,希望有识之士可以释疑。


------解决方案--------------------
关于索引的统计信息出的问题
另外 select数据的顺序并不一定是按索引生成的 对于有聚集索引的表应该是这样的
------解决方案--------------------
select数据的顺序并不一定是按索引生成的

需要有顺序产生的时候,还是需要显式的order by来指定
索引的作用仅在于提高检索速度,不保证数据输出的顺序

------解决方案--------------------
有排序的地方还是要使用ORDER BY
lz如果不能改程序那就整理一下索引试试。
------解决方案--------------------
不加 ORDER BY , 无法保证顺序
对于简单的查询, 要保证顺序, 一种是 ORDER BY , 另一种是使用 WITH(INDEX=索引名)


不采取上述两种方法顺序就难说了, 不同的执行计划会产生不同的效果, 这些会影响表扫描的方式.

至于重启和不重启, sql有内存缓存机制, 这个缓存即包括数据, 也包括执行计划, 这些都可能导致你的问题出现.
------解决方案--------------------
聚集索引确定表中数据的物理顺序,聚集索引一般是你的关键字或组合关键字

你可以在企业管理器中找到表,然后右击表在快捷菜单中选择管理索引,在弹出窗口按确认,来SQL重新整理索引,不需要重启
------解决方案--------------------
数据查询顺序,是根据查询应用的索引有关系,即使有聚集索引,没有设置ORDER BY ,也不是一定按照聚集索引排序的,跟具体的查询有关系,根据你的查询,查询优化器找到自己认为最好索引应用生成执行计划,排序就根据应用的索引来生成了,就象邹健所说强制定义应用指定索引也可以确定顺序。

但是如果表结构一样(包括索引结构),查询结果不同,这里只能认为是问题,建议索引重建