在sql server2k中,创建一个department表,有两个字段:系号,char,3,不空;系名,char,6,不空;并设置系号为主键。在其中输入如下记录:001,数学;002,计算机;003,化学。此时若改变主键的排序规则,即为升序或降序,能够按照系号正常排序。但再对系名建立UNIQUE非聚集索引以后,则记录的排序规则将按照系名进行,而不是按照主键的定义规则进行排序。因为主键系号是一个聚集索引,而结果显示的是按照非聚集索引系名进行排序,不知这是什么原因!!!
请帮忙!!!

解决方案 »

  1.   

    不管按照哪个...你只需要在查询时按照你的需求带上排序即可.例如:select * from department order by 系号 select * from department order by 系号 , 系名 select * from department order by 系名 select * from department order by 系号 , 系名 desc....
      

  2.   

    -- 索引影响查询结果顺序
    --测试数据
    CREATE TABLE tb(a int,b int,c int)
    CREATE CLUSTERED INDEX IDX_tb_a ON tb(a)
    CREATE INDEX IDX_tb_b ON tb(b)
    CREATE INDEX IDX_tb_c ON tb(c)
    INSERT tb SELECT 1,3,2
    INSERT tb SELECT 2,2,1
    INSERT tb SELECT 3,1,3--指定使用字段a上的索引
    SELECT * FROM tb WITH(INDEX=IDX_tb_a)
    /*--结果
    a           b            c
    ---------------- ------------------ ----------- 
    1           3           2
    2           2           1
    3           1           3
    --*/--指定使用字段b上的索引
    SELECT * FROM tb WITH(INDEX=IDX_tb_b)
    /*--结果
    a           b           c 
    ---------------- ------------------ ----------- 
    3           1           3
    2           2           1
    1           3           2
    --*/--指定使用字段c上的索引
    SELECT * FROM tb WITH(INDEX=IDX_tb_c)
    /*--结果
    a           b           c
    ---------------- ------------------ ----------- 
    2           2           1
    1           3           2
    3           1           3
    --*/
      

  3.   

    --测试数据
    IF NOT OBJECT_ID('[tb]') IS NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE tb(a int primary key,b int)
    INSERT tb SELECT 2,1
    INSERT tb SELECT 1,2
    INSERT tb SELECT 3,3SELECT * FROM TB 
    /*
    a           b
    ----------- -----------
    1           2
    2           1
    3           3(3 行受影响)
    */
    CREATE INDEX IDX_tb_b ON tb(b)
    SELECT * FROM TB 
    /*
    a           b
    ----------- -----------
    2           1
    1           2
    3           3(3 行受影响)
    */还真是这种情况
      

  4.   


    有可能的,引擎更喜欢扫描Uniqueu的索引。你的表恰好只有2个字段,所以便选择系名咯。你要是加多一个字段,结果便是你想的那样按系号扫描了。
    SELECT * FROM department 
      

  5.   


    --测试数据
    IF NOT OBJECT_ID('[tb]') IS NULL
        DROP TABLE [tb]
    GO
    CREATE TABLE tb(a int primary key,b int,c int)
    INSERT tb SELECT 2,1,2
    INSERT tb SELECT 1,2,3
    INSERT tb SELECT 3,3,4SELECT * FROM TB 
    /*
    a           b           c
    ----------- ----------- -----------
    1           2           3
    2           1           2
    3           3           4(3 行受影响)
    */
    CREATE INDEX IDX_tb_b ON tb(b)
    SELECT * FROM TB 
    /*
    a           b           c
    ----------- ----------- -----------
    1           2           3
    2           1           2
    3           3           4(3 行受影响)
    */真是这样,只有两个字段,引擎更喜欢扫描聚集索引,有三个以上字段,从计划看,引擎先扫描的是聚集索引。
      

  6.   


    搞不懂,sql server为什么把扫描unique的索引放在优先的位置。。有bol说明没呢?
      

  7.   

    http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/05/20/without-order-by-there-is-no-default-sort-order.aspx
      

  8.   


    google了半天。发现很多是这样解释的。
    当有聚集索引和非聚集索引同时存在时,因为非聚集索引所占用的page比较少,sqlserver会认为将使用更少的I/O,所以就自动选择了非聚集索引。如果有三列时,通过非聚集索引找到另外列的代价比较大,所以就选择了聚集索引。如果你把另外一列也添加到非聚集索引,你仍会发现,它选择的是非聚集索引,而不是聚集索引了。
      

  9.   


    http://blog.csdn.net/obuntu/archive/2010/04/22/5515800.aspx做的一个探索。可能不是问题答案,可以参考下。
      

  10.   

    还是order by 吧。
    楼主已经很了解聚集索引和非聚集索引啦。有些东西微乳不对外公开,所以原因不是很容易搞懂。