在sql server2k中,创建一个department表,有两个字段:系号,char,3,不空;系名,char,6,不空;并设置系号为主键。在其中输入如下记录:001,数学;002,计算机;003,化学。此时若改变主键的排序规则,即为升序或降序,能够按照系号正常排序。但再对系名建立UNIQUE非聚集索引以后,则记录的排序规则将按照系名进行,而不是按照主键的定义规则进行排序。因为主键系号是一个聚集索引,而结果显示的是按照非聚集索引系名进行排序,不知这是什么原因!!!
请帮忙!!!
请帮忙!!!
--测试数据
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
--*/
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 行受影响)
*/还真是这种情况
有可能的,引擎更喜欢扫描Uniqueu的索引。你的表恰好只有2个字段,所以便选择系名咯。你要是加多一个字段,结果便是你想的那样按系号扫描了。
SELECT * FROM department
--测试数据
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 行受影响)
*/真是这样,只有两个字段,引擎更喜欢扫描聚集索引,有三个以上字段,从计划看,引擎先扫描的是聚集索引。
搞不懂,sql server为什么把扫描unique的索引放在优先的位置。。有bol说明没呢?
google了半天。发现很多是这样解释的。
当有聚集索引和非聚集索引同时存在时,因为非聚集索引所占用的page比较少,sqlserver会认为将使用更少的I/O,所以就自动选择了非聚集索引。如果有三列时,通过非聚集索引找到另外列的代价比较大,所以就选择了聚集索引。如果你把另外一列也添加到非聚集索引,你仍会发现,它选择的是非聚集索引,而不是聚集索引了。
http://blog.csdn.net/obuntu/archive/2010/04/22/5515800.aspx做的一个探索。可能不是问题答案,可以参考下。
楼主已经很了解聚集索引和非聚集索引啦。有些东西微乳不对外公开,所以原因不是很容易搞懂。