34,590
社区成员
发帖
与我相关
我的任务
分享
--我也只是找到这中现象发生的情况,置于具体原因,也不得而知
--下面演示一下,是在什么情况下发生这种现象的
--后边有时间会查阅一下相关资料,有答案之后回来回复说明的
--我在本机演示一下,
--一边演示脚本一边解释测试目的
/*********第一种情况,列上指定主键**********************/
drop table [t_card]
--第一次,建表,并且制定id为主键
CREATE TABLE [dbo].[t_card](
[id] [char](36) NOT NULL primary key,
[companyId] [int] NULL,
[shopid] [int] NULL
) ON [PRIMARY]
--插入测试数据
insert into t_card values (NEWID(),1,1)
insert into t_card values (NEWID(),1,2)
insert into t_card values (NEWID(),2,1)
insert into t_card values (NEWID(),2,2)
insert into t_card values (NEWID(),3,1)
insert into t_card values (NEWID(),3,2)
--执行查询
select * from t_card;
--制定主键的时候,默认在主键上建立聚集索引
--根据查询结果,很容易看出来是按照id列排序的
/*
id companyId shopid
------------------------------------ ----------- -----------
1EE06752-F0C9-48A7-A701-E9E36A0597F3 2 1
2D0F9EF7-A491-461E-A2E0-361D8BB5F3F9 2 2
51A6A413-1F85-4A54-AB15-71CB578781A3 3 2
7660BD62-73B1-4A68-8E4B-718AB33A40B2 1 1
C5C65857-0B70-4867-9CB3-2FDA56B67EB6 3 1
F6283875-3223-4255-8848-1BB27B6E539B 1 2
(6 行受影响)
*/
--对于默认主键生成的聚集索引,我们用脚本删除的时候,提示错误
drop index PK__t_card__3213E83F6754599E on t_card
--不允许对索引 't_card.PK__t_card__3213E83F6754599E' 显式地使用 DROP INDEX。
--该索引正用于 PRIMARY KEY 约束的强制执行。
--那么我就在SSMS中“右键”菜单功能删除这个聚集索引
--然后建立一个聚集索引(模仿你聚集键)
create unique clustered index index_1 on t_card(companyid,shopid,id)
--命令已成功完成。
--顺便再插入一条数据
insert into t_card values (NEWID(),2,4)
--再次查询,可以看到按照预期的索引排序了
select * from t_card;
/*
id companyId shopid
------------------------------------ ----------- -----------
7660BD62-73B1-4A68-8E4B-718AB33A40B2 1 1
F6283875-3223-4255-8848-1BB27B6E539B 1 2
1EE06752-F0C9-48A7-A701-E9E36A0597F3 2 1
2D0F9EF7-A491-461E-A2E0-361D8BB5F3F9 2 2
EE6655B0-CDCA-4D00-8325-33730C28CB7C 2 6
C5C65857-0B70-4867-9CB3-2FDA56B67EB6 3 1
51A6A413-1F85-4A54-AB15-71CB578781A3 3 2
(7 行受影响)
*/
/********第二种情况,列上指定主键,非聚集索引*************/
drop table [t_card]
CREATE TABLE [dbo].[t_card](
[id] [char](36) primary key NONCLUSTERED ,
[companyId] [int] NULL,
[shopid] [int] NULL
) ON [PRIMARY]
--插入数据时,特意调了一下插入的顺序
insert into t_card values (NEWID(),1,1)
insert into t_card values (NEWID(),1,2)
insert into t_card values (NEWID(),3,1)
insert into t_card values (NEWID(),3,2)
insert into t_card values (NEWID(),2,1)
insert into t_card values (NEWID(),2,2)
select * from [t_card]
--很明显,默认顺序是无序的,没有按照哪个列排序
/*
id companyId shopid
------------------------------------ ----------- -----------
F7484505-3E0C-42E8-80D7-9160726EEDEE 1 1
B153F47D-4FE5-4435-8131-D1D14ED512B1 1 2
C3F2571C-1613-4ADC-A4C3-9E3089C3E384 3 1
34102E5C-C486-494D-96E4-807F3C1E01DC 3 2
E47C8EEF-D905-4A97-9051-029B34BC667D 2 1
CBBF8A87-72ED-4FB6-BD4C-880ABD50CAAC 2 2
(6 行受影响)
*/
--建立聚集索引
create unique clustered index index_1 on t_card(companyid,shopid,id)
select * from [t_card]
--问题就出在这里,
/*
*********************************************************
*建表时,指定了主键,且指定主键为非聚集索引
*然后在其他列上建立了聚集索引,默认排序竟然是按照主键来排序的
*再怎么重建索引,也没有按照预期的列排序
**********************************************************
*/
/*
id companyId shopid
------------------------------------ ----------- -----------
218A084F-B30A-4708-8920-F014C0521463 1 2
7B6BB287-B8D8-40D2-A986-CA515172A84B 1 1
AF462D7C-AA87-4249-9849-FE6BD2BFE032 3 1
B1C6062C-FBF0-44DE-9A6F-27F091EE537E 2 2
D582665C-7F42-4C91-AF2A-3FBECBA216E1 2 1
DAB65C80-3978-45FB-B0FB-000178158A27 3 2
(6 行受影响)
*/
/********第三种情况,列上没有任何约束,自定义聚集或者非聚集索引*************/
--这个就不测试了,都是预期的排序情况
--测试了一下,好像木有问题啊
select @@VERSION
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86)
Apr 2 2010 15:53:02
Copyright (c) Microsoft Corporation
Enterprise Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
(1 行受影响)
create table t_card
(
id char(36),
companyId int,
shopid int
)
create clustered index index_tcard on t_card(id)
insert into t_card values (NEWID(),1,1)
insert into t_card values (NEWID(),1,2)
insert into t_card values (NEWID(),2,1)
insert into t_card values (NEWID(),2,2)
select * from t_card
id companyId shopid
------------------------------------ ----------- -----------
3A517FA4-7CE8-44EC-BA00-E03461C8552B 1 2
3D0AF66E-5251-4063-9AED-421ACB519EDD 1 1
5C0F844A-F0EA-4A71-B7DA-8109727F3060 2 1
F4EEDFF7-DFD6-4F32-A7B9-1B1BABC4A150 2 2
(4 行受影响)
drop index index_tcard on t_card
create clustered index index_tcard on t_card(companyId,shopid,id)
select * from t_card
id companyId shopid
------------------------------------ ----------- -----------
3D0AF66E-5251-4063-9AED-421ACB519EDD 1 1
3A517FA4-7CE8-44EC-BA00-E03461C8552B 1 2
5C0F844A-F0EA-4A71-B7DA-8109727F3060 2 1
F4EEDFF7-DFD6-4F32-A7B9-1B1BABC4A150 2 2
(4 行受影响)