另外,没有哪个地方说过select * from yourtable 就是按照聚集索引排序的吧?要排序还是用order by
sky_blue(老衲):不对,可以在主键以外创建聚集索引的。如果没有先设定聚集索引,在创建主键时会在主键上创建聚集索引。如果一个表有聚集索引,select * from yourtable就是按聚集索引的顺序返回记录。因为聚集索引实际上是记录存放的顺序。如果一个表没有聚集索引,返回的记录顺序是随机的。
第一个是我的说法有问题,可能没表达对,引用的话是对的第二个"如果一个表有聚集索引,select * from yourtable就是按聚集索引的顺序返回记录"我表示怀疑。没有说结果集一定和聚集索引有必然联系。
你可以在查询分析器里用“显示估计的执行计划”看一下,select * from mytable 对于有聚集索引的表是用的“Clustered index scan”,对于没有聚集索引的表用的是“table scan”。
to: sky_blue(老衲) 如果没有排序,查询出来的顺序确实是按聚集索引的. 有资料表明,按输入次序的聚集索引并不是一个好的选择,会影响聚集索引的效率,但可惜本人才疏学浅,虽然资料说了所以然,我没有看懂,只记住了其然.
我的观点(针对有聚集索引的情况)是:对于select * from yourtable 因为查询很简单,所以数据库很可能就是按照聚集索引的顺序把所有的记录依次形成结果集。但是,并不能说看到的这个顺序一定就是存储的顺序,从实现的角度来讲,完全可以几个CPU或者线程一起做,最后把结果合起来。这样顺序并不一定就是存储的顺序。不过现在的并行处理主要是针对复杂查询的,所以认为看到的就是聚集索引的顺序也对。
安全起见,还是指定order by吧
又找到一点论据,呵呵 Clustered Index Scan Clustered Index Scan 逻辑运算符和物理运算符扫描 Argument 列内指定的聚集索引。当可选 WHERE:() 谓词出现,则只返回满足该谓词的行。如果 Argument 列包含 ORDERED 子句,则表示查询处理器已请求按聚集索引排序行的顺序返回行输出。如果没有出现 ORDERED 子句,存储引擎将以最佳方式(不保证对输出排序)扫描索引。
我们都知道SQLSERVER是通过PAGE来保存RECORDS, 1.如果该TABLE没有聚集索引,SQLSERVER保存每条记录的具体地址,并且按着这个地址SCAN FULL TABLE查找某条记录. 2.如果该TABLE有聚集索引,SQLSERVER保存指向每条记录的地址的指针,(INDEX TABLE),SQL SERVER通过INDEX TABLE查找某条记录. 而SQL SERVER7.0 AND SQL SERVER 2000对查询进行了优化,也就是说,如果一个表有聚集索引,SQL SERVER并不一定会通过聚集索引来查找记录,这要根据记录的多少和大小来确定,如果该表的记录很少,SQL SERVER查询优化器会通过TABLE SCAN来查找指定的记录,而不会通过聚集索引来查找. 大家可以试验: select field1,sum(field2) from tablename group by field1 如果分组的数据集很小,执行步骤中就有排序的操作,如果数据集比较大,结果集就是随机的排序.(SQL SERVER7 AND 2000 的BUG) 所以SQL SERVER会有一个临界点来区分是TABLE SCAN还是通过聚集索引.
A:SQL SERVER是根据表的clustered索引来排序的,宾且和你的默认字符集又关联.
顺序依然为按那三个字段排序,为什么?因为约束也是索引吗?如何解决!
------------------------------------
也就是说只有主键是聚集索引
------------------------------------
如果没有排序,查询出来的顺序确实是按聚集索引的.
有资料表明,按输入次序的聚集索引并不是一个好的选择,会影响聚集索引的效率,但可惜本人才疏学浅,虽然资料说了所以然,我没有看懂,只记住了其然.
Clustered Index Scan
Clustered Index Scan 逻辑运算符和物理运算符扫描 Argument 列内指定的聚集索引。当可选 WHERE:() 谓词出现,则只返回满足该谓词的行。如果 Argument 列包含 ORDERED 子句,则表示查询处理器已请求按聚集索引排序行的顺序返回行输出。如果没有出现 ORDERED 子句,存储引擎将以最佳方式(不保证对输出排序)扫描索引。
studying......
up!
这样讨论是不错,至少现在脑袋里又条“结论”后面加了个问号了,呵呵。。找不到更多的资料来说明“最佳方式”到底是怎么样的,虽然我认为SQL的查询分析器永远是能用聚集索引就用聚集索引的(因为这样是最省力的)。但它又不能保证一定按聚集索引的排序输出结果,我还是想不出是为什么,但愿只是他们保守的说法:)有兴趣的继续讨论。
1.如果该TABLE没有聚集索引,SQLSERVER保存每条记录的具体地址,并且按着这个地址SCAN FULL TABLE查找某条记录.
2.如果该TABLE有聚集索引,SQLSERVER保存指向每条记录的地址的指针,(INDEX TABLE),SQL SERVER通过INDEX TABLE查找某条记录.
而SQL SERVER7.0 AND SQL SERVER 2000对查询进行了优化,也就是说,如果一个表有聚集索引,SQL SERVER并不一定会通过聚集索引来查找记录,这要根据记录的多少和大小来确定,如果该表的记录很少,SQL SERVER查询优化器会通过TABLE SCAN来查找指定的记录,而不会通过聚集索引来查找.
大家可以试验:
select field1,sum(field2) from tablename group by field1
如果分组的数据集很小,执行步骤中就有排序的操作,如果数据集比较大,结果集就是随机的排序.(SQL SERVER7 AND 2000 的BUG)
所以SQL SERVER会有一个临界点来区分是TABLE SCAN还是通过聚集索引.