我们来看一个简单的查询语句:SELECT * FROM T1 ORDER BY ID,T1表上的ID列为int数据类型,如果该表 上为ID列创建了一个按照升序排列的聚集索引,那么这个查询语句返回的结果集效果等价于这条语句: SELECT * FROM T1,这是因为如果表上创建了聚集索引,那么其数据的存储则是按照聚集索引指定的顺序排列, 因此再对聚集索引列排序是画蛇添足,下面我们举例来说明。
我们先创建一个测试表T1(以下在WindowsXP+SQLServer2008环境下通过),表上只有一个int类型的列ID, 我们顺序为其插入1~500的整数,然后再依次插入504,503,501,502,然后执行查询: SELECT * FROM T1 WHERE ID > 499,结果如图:
我们可以看到,返回的结果集的是没有大小顺序的,当然因为我们没有指定ORDER BY语句,接着我们 加上ORDER BY ID的排序语句后,执行结果如图:
我们看到ID已经按照从小到大的顺序返回,接着我们为ID列创建一个按照升序排列的聚集索引,然后 执行语句:SELECT * FROM T1 WHERE ID >= 499,结果如图:
结果验证了之前的论述,这会不会是巧合呢?我们继续测试,我们把创建的聚集索引删除,然后再次执行 语句:SELECT * FROM T1 WHERE ID >= 499,结果如图:
通过结果,我们可以看到,即使我们这个时候没有加上ORDER BY语句,这时候的数据依然会按照从小 到大的顺序排列,这是因为,在创建索引时,其数据内部的分配做了调整,关于这点,我们等会会验证它, 我们这时候重新创建索引,但是是创建降序索引,然后再次执行同样的语句,结果如图:
从结果的返回来看,ID列的确是按照降序的排列返回,也从而论证了我们之前提到的结论。 通过这个例子,希望让更多的朋友能加深对聚集索引的了解,同时上面提到的,聚集索引创建了以后,其 数据页内部分配做了调整,关于这个,我将会在第二序章讨论,欢迎网友参与讨论。