天天看點

索引:如何讓主鍵不自動建立聚集索引???

索引的增删改查

--前提代碼:
--建立資料庫
create database UsersDBTest  --sqlserver這一句話就可以建立資料庫,其它按預設值建立。
 --建立表
  create table UserInfo
  (
    ID int identity(1,1) not null, 
    Uname nvarchar(max) not null,
    Pwd nvarchar(max) not null,
    ShowName nvarchar(max) null,

  );
    
--代碼建立主鍵

 Alter table UserInfo
    add constraint PK_UserInfo  --給主鍵限制取别名,寓意:UserInfo表的主鍵限制。取别名的好處是1删除友善2為多個列定義同時限制,即主鍵組。
    Primary Key (ID Asc); --主鍵限制 ,根據ID升序排序
--但是重新整理表後發現 索引項多了 PK_UserInfo 
---sqlserver自動對主鍵列建立了聚集索引(補充:主鍵預設是唯一的是以也是唯一索引)  

--相當于   
 Alter table UserInfo
    add constraint PK_UserInfo  
    Primary Key Clustered (ID Asc); 
    

--問題:1能不能把建立索引與主鍵分離,然後單獨對添加、修改和删除索引?
--百度得:
--添加索引:CREATE INDEX   索引名稱    ON  表名(列)
--删除索引:drop index 索引名稱  on  表名
--查尋索引: select * from sys.indexes where name='索引名稱'; 
 --并沒發現直接修改索引的文法,那就先删除再添加吧。
 
--drop Index PK_UserInfo On UserInfo
--報錯:不允許對索引 'UserInfo.PK_UserInfo' 顯式地使用 DROP INDEX。該索引正用于 PRIMARY KEY 限制的強制執行。

 alter table UserInfo drop constraint PK_UserInfo
 --結果:聚集索引沒了,但主鍵限制也沒來。
 
 --單獨建立UserInfo表索引列和索引類型
 create Index IX_UserInfo On UserInfo(ID); --為了好區分,IX_UserInfo是我為索引取的别名。
--結果:不唯一,非聚集索引

 Alter table UserInfo
    add constraint PK_UserInfo
    Primary Key  (ID Asc);
--重建主鍵限制,結果:預設又為主鍵建立了聚集索引!

--删除IX_UserInfo
  drop Index IX_UserInfo On UserInfo
--為什麼對于自己建立的索引,顯式删除有效,對系統預設建立索引的就無效。。

--問題2:如何取消主鍵自動建立索引???

--方案一
-- 1. 首先删除主鍵, 然後重新建立主鍵, 
  Alter table UserInfo drop constraint PK_UserInfo
--2重新建立主鍵的時候, 需要說明本主鍵是使用 非聚集索引
  Alter table UserInfo 
    add  constraint PK_UserInfo
      Primary Key NonClustered (ID);
--3為需要聚集索引的列建立聚集索引  
    Create  Clustered  Index IX_UserInfo_UName on UserInfo (UName);  
--4想加唯一限制,滑鼠卻删不掉,代碼删除
  Drop index IX_RoleInfo_UName on UserInfo;
    Create Unique Clustered  Index IX_UserInfo_UName on UserInfo (UName); 
  
--查詢索引:重新整理表後檢視索引項,或者代碼檢視   
select * from sys.indexes where name='IX_UserInfo_UName';    


--方案二
------設定非主鍵為聚集索引【4步】
--1. 檢視所有的索引,預設情況下主鍵上都會建立聚集索引
    sp_helpindex UserInfo
    
-- 2. --删除主鍵限制,進而删除主鍵上的索引限制。
 alter table UserInfo drop constraint PK_UserInfo
 
-- 3.--建立聚集索引到其它列
 create  Clustered  Index IX_UserInfo_UName on UserInfo (UName);
 
-- 4.—修改原來的主鍵字段還是為主鍵,此時會自動建立非聚集索引【一張表聚集索引隻能有一個】
 alter table UserInfo add primary key (ID)
--如果想自定義名稱
   Alter table UserInfo 
    add  constraint PK_UserInfo
      Primary Key(ID);


--最終結論:兩種方案大同小異,隻能把主鍵改為非聚集索引,但是會有索引。
--不過把聚集索引的位置騰出來了(一張表隻能建立一個聚集索引)。      

--但是索引本質到底是什麼?

--百度百科:

--索引是為了加速對表中資料行的檢索而建立的一種分散的存儲結構。索引是針對表而建立的,它是由資料頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索實體資料。

--在資料庫關系圖中,可以在標明表的“索引/鍵”屬性頁中建立、編輯或删除每個索引類型。當儲存索引所附加到的表,或儲存該表所在的關系圖時,索引将儲存在資料庫中。 

--當表中有大量記錄時,若要對表進行查詢,第一種搜尋資訊方式是全表搜尋,是将所有記錄一一取出,和查詢條件進行一一對比,然後傳回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,并造成大量磁盤I/O操作; --第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過儲存在索引中的ROWID(相當于頁碼)快速找到表中對應的記錄。

--注意建立索引也需要時間和計算量,一般隻用于經常需要通路的列。

--聚集索引:實體存儲順序與邏輯順序一緻,線性結構(一條直線)。

--非聚集索引:實體存儲順序與邏輯順序不一緻:樹狀(多條分支)。

樹立目标,保持活力,gogogo!

繼續閱讀