SQL Server 索引和視圖
? 索引
??? 1、 什么是索引
??????? 索引就是數據表中數據和相應的存儲位置的列表,利用索引可以提高在表或視圖中的查找數據的速度。
?
??? 2、 索引分類
??????? 數據庫中索引主要分為兩類:聚集索引和非聚集索引。SQL Server 2005還提供了唯一索引、索引視圖、全文索引、xml索引等等。聚集索引和非聚集索引是數據庫引擎中索引的基本類型,是理解其他類型索引的基礎。
?
??? # 聚集索引
??????? 聚集索引是值表中數據行的物理存儲順序和索引的存儲順序完全相同。聚集索引根據索引順序物理地重新排列了用戶插入到表中的數據,因此,每個表只能創建一個聚集索引。聚集索引經常創建在表中經常被搜索到的列或按順序訪問的列上。在默認情況下,主鍵約束自動創建聚集索引。
?
??? # 非聚集索引
??????? 非聚集索引不改變表中數據列的物理存儲位置,數據與索引分開存儲,通過索引指向的地址與表中的數據發生關系。
??????? 非聚集索引沒有改變表中物理行的位置,索引可以在以下情況下使用非聚集索引:
??????? 一、如果某個字段的數據唯一性比較高
??????? 二、如果查詢所得到的數據量比較少
?
聚集索引和非聚集索引的區別:
聚集索引 |
非聚集索引 |
每個表只允許創建一個聚集索引 |
最多可以有249個非聚集索引 |
物理的重排表中的數據以符合索引約束 |
創建一個鍵值列表,鍵值指向數據在數據頁中的位置 |
用于經常查找數據的列 |
用于從表中查找單個值的列 |
??? # 其他類型索引
??? 除了以上索引,還有以下類型索引:
??????? a、 唯一索引:如果希望索引鍵都不同,可以創建唯一索引。聚集索引和非聚集索引都可以是唯一索引。
??????? b、 包含新列索引:索引列的最大數量是16個,索引列的字節總數的最高值是900。如果當多個列的字節總數大于900,切又想在這些劣種都包含索引是,可以使用包含性列索引
??????? c、 視圖索引:提供視圖查詢效率,可以視圖的索引物理化,也就是說將結果集永久存儲在索引中,可以創建視圖索引。
??????? d、 XML索引:是與xml數據關聯的索引形式,是XML二進制blob的已拆分持久表示形式
??????? e、 全文索引:一種特殊類型的基于標記的功能性功能,用于幫助在字符串中搜索賦值的詞
???
??? 3、 創建索引
??? 語法
create [ unique ] [ clustered | noclustered]
index
index_name
on
table_name (column_name ...)
[ with fillfactor =x]
??? unique唯一索引
??? clustered聚集索引
??? noclustered非聚集索引
??? fillfactor填充因子大小,范圍在0-100直接,表示索引頁填滿的空間所占的百分比。
?
??? 示例
if ( exists ( select * from sys.indexes where name = 'idx_stu_name' ))
drop index student.idx_stu_name
go
create index idx_stu_name
on
student(name);
?
--聯合索引
if ( exists ( select * from sys.indexes where name = 'idx_uqe_clu_stu_name_age' ))
drop index student.idx_uqe_clu_stu_name_age
go
create unique clustered index idx_uqe_clu_stu_name_age
on
student(name, age);
?
if ( exists ( select * from sys.indexes where name = 'idx_cid' ))
drop index student.idx_cid
go
?
if ( exists ( select * from sys.indexes where name = 'idx_cid' ))
drop index student.idx_cid
go
?
--非聚集索引
create nonclustered index idx_cid
on
student (cid)
with fillFactor = 30; --填充因子
?
--聚集索引
if ( exists ( select * from sys.indexes where name = 'idx_sex' ))
drop index student.idx_sex
go
create clustered index idx_sex
on
student(sex);
?
--聚集索引
if ( exists ( select * from sys.indexes where name = 'idx_name' ))
drop index student.idx_name
go
create unique index idx_name
on
student(name);
???
??? 4、 適合的創建索引的列
??????? 當數據庫的某一列被頻繁的用于數據庫查詢時,或者該列用于數據庫進行排序時可以創建成索引
?
??? 5、 不適合創建索引的列
??????? 如果列中有幾個不同的值,或者表中僅包含幾行值,則不推薦為其創建索引。因為索引在搜索數據所花的時間比在表中逐行搜索話的時間更長。
?
? 視圖
??? 1、 什么是視圖
??????? 視圖就是一個虛擬的數據表,該數據表中的數據記錄是有一條查詢語句的查詢結果得到的。
?
??? 2、 創建視圖準則
??????? 創建視圖需要考慮一下準則:
??? # 視圖名稱必須遵循標識符的規則,該名稱不得與該架構的如何表的名稱相同
??? # 你可以對其他視圖創建視圖。允許嵌套視圖,但嵌套不得超過32層。視圖最多可以有1024個字段
??? # 不能將規則和default定義于視圖相關聯
??? # 視圖的查詢不能包含compute子句、compute by子句或into關鍵字
??? # 定義視圖的查詢不能包含order by子句,除非在select 語句的選擇列表中還有top子句
???
??? 下列情況必須指定視圖中每列的名稱:
??? # 視圖中的如何列都是從算術表達式、內置函數或常量派生而來
??? # 視圖中有兩列或多列具有相同名稱(通常由于視圖定義包含聯接,因此來自兩個或多個不同的列具有相同的名稱)
??? # 希望視圖中的列指定一個與其原列不同的名稱(也可以在視圖中重命名列)。無論是否重命名,視圖列都回繼承原列的數據類型
?
??? 3、 創建視圖
--創建視圖
if ( exists ( select * from sys.objects where name = 'v_stu' ))
drop view v_stu
go
create view v_stu
as
select id, name, age, sex from student;
???
??? 4、 修改視圖
alter view v_stu
as
select id, name, sex from student;
?
alter view v_stu(編號, 名稱, 性別)
as
select id, name, sex from student
go
select * from v_stu;
?
select * from information_schema.views;
???
??? 5、 加密視圖
?
?
?
--加密視圖
if ( exists ( select * from sys.objects where name = 'v_student_info' ))
drop view v_student_info
go
create view v_student_info
with
encryption --加密
as
select id, name, age from student
go
--view_definition is null
select * from information_schema.views
where table_name like 'v_stu' ;
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
