Ⅰ sql怎麼建立索引
什麼是索引
拿漢語字典的目錄頁(索引)打比方:正如漢語字典中的漢字按頁存放一樣,SQL Server中的數據記錄也是按頁存放的,每頁容量一般為4K 。為了加快查找的速度,漢語字(詞)典一般都有按拼音、筆畫、偏旁部首等排序的目錄(索引),我們可以選擇按拼音或筆畫查找方式,快速查找到需要的字(詞)。
同理,SQL Server允許用戶在表中創建索引,指定按某列預先排序,從而大大提高查詢速度。
• SQL Server中的數據也是按頁( 4KB )存放
• 索引:是SQL Server編排數據的內部方法。它為SQL Server提供一種方法來編排查詢數據。
• 索引頁:資料庫中存儲索引的數據頁;索引頁類似於漢語字(詞)典中按拼音或筆畫排序的目錄頁。
• 索引的作用:通過使用索引,可以大大提高資料庫的檢索速度,改善資料庫性能。
索引類型
• 唯一索引:唯一索引不允許兩行具有相同的索引值
• 主鍵索引:為表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的,並且不能為空
• 聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個表只能有一個
• 非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數據存儲在一個位置,索引存儲在另一個位置,索引中包含指向數據存儲位置的指針。可以有多個,小於249個
索引類型:再次用漢語字典打比方,希望大家能夠明白聚集索引和非聚集索引這兩個概念。
唯一索引:
唯一索引不允許兩行具有相同的索引值。
如果現有數據中存在重復的鍵值,則大多數資料庫都不允許將新創建的唯一索引與表一起保存。當新數據將使表中的鍵值重復時,資料庫也拒絕接受此數據。例如,如果在stuInfo表中的學員員身份證號(stuID) 列上創建了唯一索引,則所有學員的身份證號不能重復。
提示:創建了唯一約束,將自動創建唯一索引。盡管唯一索引有助於找到信息,但為了獲得最佳性能,建議使用主鍵約束或唯一約束。
主鍵索引:
在資料庫關系圖中為表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的。當在查詢中使用主鍵索引時,它還允許快速訪問數據。
聚集索引(clustered index)
在聚集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。表只能包含一個聚集索引。例如:漢語字(詞)典默認按拼音排序編排字典中的每頁頁碼。拼音字母a,b,c,d……x,y,z就是索引的邏輯順序,而頁碼1,2,3……就是物理順序。默認按拼音排序的字典,其索引順序和邏輯順序是一致的。即拼音順序較後的字(詞)對應的頁碼也較大。如拼音「ha」對應的字(詞)頁碼就比拼音「ba」 對應的字(詞)頁碼靠後。
非聚集索引(Non-clustered)
如果不是聚集索引,表中各行的物理順序與鍵值的邏輯順序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的數據訪問速度。例如,按筆畫排序的索引就是非聚集索引,「1」畫的字(詞)對應的頁碼可能比「3」畫的字(詞)對應的頁碼大(靠後)。
提示:SQL Server中,一個表只能創建1個聚集索引,多個非聚集索引。設置某列為主鍵,該列就默認為聚集索引
如何創建索引
使用T-SQL語句創建索引的語法:
CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]
INDEX index_name
ON table_name (column_name…)
[WITH FILLFACTOR=x]
q UNIQUE表示唯一索引,可選
q CLUSTERED、NONCLUSTERED表示聚集索引還是非聚集索引,可選
q FILLFACTOR表示填充因子,指定一個0到100之間的值,該值指示索引頁填滿的空間所佔的百分比
在stuMarks表的writtenExam列創建索引:
USE stuDB
GO
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'IX_writtenExam')
DROP INDEX stuMarks.IX_writtenExam
/*--筆試列創建非聚集索引:填充因子為30%--*/
CREATE NONCLUSTERED INDEX IX_writtenExam
ON stuMarks(writtenExam)
WITH FILLFACTOR= 30
GO
/*-----指定按索引 IX_writtenExam 查詢----*/
SELECT * FROM stuMarks (INDEX=IX_writtenExam)
WHERE writtenExam BETWEEN 60 AND 90
雖然我們可以指定SQL Server按哪個索引進行數據查詢,但一般不需要我們人工指定。SQL Server將會根據我們創建的索引,自動優化查詢。
索引的優缺點
• 優點
– 加快訪問速度
– 加強行的唯一性
• 缺點
– 帶索引的表在資料庫中需要更多的存儲空間
– 操縱數據的命令需要更長的處理時間,因為它們需要對索引進行更新
創建索引的指導原則
• 請按照下列標准選擇建立索引的列。
– 該列用於頻繁搜索
– 該列用於對數據進行排序
• 請不要使用下面的列創建索引:
– 列中僅包含幾個不同的值。
– 表中僅包含幾行。為小型表創建索引可能不太劃算,因為SQL Server在索引中搜索數據所花的時間比在表中逐行搜索所花的時間更長
Ⅱ SQL,索引的例子
就用 mysql 資料庫舉例吧
一、什麼是索引?
索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式保存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜索條件的列上已經創建了索引,MySQL無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查找記錄至少要比順序掃描記錄快100倍。
假設我們創建了一個名為people的表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );
然後,我們完全隨機把1000個不同name值插入到people表。下圖顯示了people表所在數據文件的一小部分:
可以看到,在數據文件中name列沒有任何明確的次序。如果我們創建了name列的索引,MySQL將在索引中排序name列:
對於索引中的每一項,MySQL在內部為它保存一個數據文件中實際記錄所在位置的「指針」。因此,如果我們要查找name等於「Mike」記錄的peopleid(SQL命令為「SELECT peopleid FROM people WHERE name=\'Mike\';」),MySQL能夠在name的索引中查找「Mike」值,然後直接轉到數據文件中相應的行,准確地返回該行的peopleid(999)。在這個過程中,MySQL只需處理一個行就可以返回結果。如果沒有「name」列的索引,MySQL要掃描數據文件中的所有記錄,即1000個記錄!顯然,需要MySQL處理的記錄數量越少,則它完成任務的速度就越快。
二、索引的類型
MySQL提供多種索引類型供選擇:
普通索引
這是最基本的索引類型,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式創建:
創建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
創建表的時候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );
唯一性索引
這種索引和前面的「普通索引」基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。唯一性索引可以用以下幾種方式創建:
創建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
創建表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );
主鍵
主鍵是一種唯一性索引,但它必須指定為「PRIMARY KEY」。如果你曾經用過AUTO_INCREMENT類型的列,你可能已經熟悉主鍵之類的概念了。主鍵一般在創建表的時候指定,例如「CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); 」。但是,我們也可以通過修改表的方式加入主鍵,例如「ALTER TABLE tablename ADD PRIMARY KEY (列的列表); 」。每個表只能有一個主鍵。
全文索引
MySQL從3.23.23版開始支持全文索引和全文檢索。在MySQL中,全文索引的索引類型為FULLTEXT。全文索引可以在VARCHAR或者TEXT類型的列上創建。它可以通過CREATE TABLE命令創建,也可以通過ALTER TABLE或CREATE INDEX命令創建。對於大規模的數據集,通過ALTER TABLE(或者CREATE INDEX)命令創建全文索引要比把記錄插入帶有全文索引的空表更快。本文下面的討論不再涉及全文索引,要了解更多信息,請參見MySQL documentation。
三、單列索引與多列索引
索引可以是單列索引,也可以是多列索引。下面我們通過具體的例子來說明這兩種索引的區別。假設有這樣一個people表:
ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);
由於索引文件以B-樹格式保存,MySQL能夠立即轉到合適的firstname,然後再轉到合適的lastname,最後轉到合適的age。在沒有掃描數據文件任何一個記錄的情況下,MySQL就正確地找出了搜索的目標記錄!
那麼,如果在firstname、lastname、age這三個列上分別創建單列索引,效果是否和創建一個firstname、lastname、age的多列索引一樣呢?答案是否定的,兩者完全不同。當我們執行查詢的時候,MySQL只能使用一個索引。如果你有三個單列的索引,MySQL會試圖選擇一個限制最嚴格的索引。但是,即使是限制最嚴格的單列索引,它的限制能力也肯定遠遠低於firstname、lastname、age這三個列上的多列索引。
四、最左前綴
多列索引還有另外一個優點,它通過稱為最左前綴(Leftmost Prefixing)的概念體現出來。繼續考慮前面的例子,現在我們有一個firstname、lastname、age列上的多列索引,我們稱這個索引為fname_lname_age。當搜索條件是以下各種列的組合時,MySQL將使用fname_lname_age索引:
firstname,lastname,age
firstname,lastname
firstname
從另一方面理解,它相當於我們創建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)這些列組合上的索引。下面這些查詢都能夠使用這個fname_lname_age索引:
table type possible_keys key key_len ref rows Extra people ref fname_lname_age fname_lname_age 102 const,const,const 1 Where used
下面我們就來看看這個EXPLAIN分析結果的含義。
table:這是表的名字。
type:連接操作的類型。下面是MySQL文檔關於ref連接類型的說明:
「對於每一種與另一個表中記錄的組合,MySQL將從當前的表讀取所有帶有匹配索引值的記錄。如果連接操作只使用鍵的最左前綴,或者如果鍵不是UNIQUE或PRIMARY KEY類型(換句話說,如果連接操作不能根據鍵值選擇出唯一行),則MySQL使用ref連接類型。如果連接操作所用的鍵只匹配少量的記錄,則ref是一種好的連接類型。」
在本例中,由於索引不是UNIQUE類型,ref是我們能夠得到的最好連接類型。
如果EXPLAIN顯示連接類型是「ALL」,而且你並不想從表裡面選擇出大多數記錄,那麼MySQL的操作效率將非常低,因為它要掃描整個表。你可以加入更多的索引來解決這個問題。預知更多信息,請參見MySQL的手冊說明。
possible_keys:
可能可以利用的索引的名字。這里的索引名字是創建索引時指定的索引昵稱;如果索引沒有昵稱,則默認顯示的是索引中第一個列的名字(在本例中,它是「firstname」)。默認索引名字的含義往往不是很明顯。
Key:
它顯示了MySQL實際使用的索引的名字。如果它為空(或NULL),則MySQL不使用索引。
key_len:
索引中被使用部分的長度,以位元組計。在本例中,key_len是102,其中firstname佔50位元組,lastname佔50位元組,age佔2位元組。如果MySQL只使用索引中的firstname部分,則key_len將是50。
ref:
它顯示的是列的名字(或單詞「const」),MySQL將根據這些列來選擇行。在本例中,MySQL根據三個常量選擇行。
rows:
MySQL所認為的它在找到正確的結果之前必須掃描的記錄數。顯然,這里最理想的數字就是1。
Extra:
這里可能出現許多不同的選項,其中大多數將對查詢產生負面影響。在本例中,MySQL只是提醒我們它將用WHERE子句限制搜索結果集。
七、索引的缺點
到目前為止,我們討論的都是索引的優點。事實上,索引也是有缺點的。
首先,索引要佔用磁碟空間。通常情況下,這個問題不是很突出。但是,如果你創建每一種可能列組合的索引,索引文件體積的增長速度將遠遠超過數據文件。如果你有一個很大的表,索引文件的大小可能達到操作系統允許的最大文件限制。
第二,對於需要寫入數據的操作,比如DELETE、UPDATE以及INSERT操作,索引會降低它們的速度。這是因為MySQL不僅要把改動數據寫入數據文件,而且它還要把這些改動寫入索引文件。
【結束語】
在大型資料庫中,索引是提高速度的一個關鍵因素。不管表的結構是多麼簡單,一次500000行的表掃描操作無論如何不會快。如果你的網站上也有這種大規模的表,那麼你確實應該花些時間去分析可以採用哪些索引,並考慮是否可以改寫查詢以優化應用。要了解更多信息,請參見MySQL manual。另外注意,本文假定你所使用的MySQL是3.23版,部分查詢不能在3.22版MySQL上執行。
Ⅲ sql的索引到底是什麼能用代碼舉個例子演示下嗎
索引的作用是加快數據的檢索速度,能夠讓你更快速查找到對應的數據
create index 索引名 on 表名(列名),表示在此表中的某個列上創建一個索引,這樣在以後需要以此列作為查詢條件時速度將會快很多,所以一般我們都是將操作相對頻繁的列才會加上索引
Ⅳ 求一個sql語句創建表的例子,帶索引的那種,希望詳細點謝謝
CREATE TABLE WAREHOUSE (
WAREHOUSE_ID NUMBER NOT NULL,
WAREHOUSE_NAME VARCHAR2(100),
WAREHOUSE_CODE VARCHAR2(20) NOT NULL,
ADDRESS_ID NUMBER,
CREATED_DATE DATE,
CREATED_BY VARCHAR2(100),
UPDATED_DATE DATE,
UPDATED_BY VARCHAR2(100),
STATUS CHAR(1),
CONSTRAINT PK_WAREHOUSE PRIMARY KEY (WAREHOUSE_ID)
);
Ⅳ SQL語言中「索引」具體什麼意思舉例說明!有什麼用
索引,你去圖書館結過書吧?為了很方便的找到書名,圖書館一般來講都會把書名按照字母排序製作成卡片,方便閱覽者查閱。假如自己去圖書架上一本一本的查找,估計一整天都會耗在圖書館了。 這些卡片就是索引。 同理。索引在資料庫中也是為了提高查詢速度而為某一個或者某幾個欄位建的「卡片」。索引是資料庫應用開發者根據應用的實際情況建立的。 比如假如一個人事管理系統,人名的查詢經常會被用到,那麼通常會給這個欄位建一個索引。
Ⅵ Oracle創建索引SQL簡單的例子,在表中的指定欄位和如何使用索引呢
創建索引:create index emp_id1(索引名) on emp(empno,ename,deptno) ;
在創建索引時需要制定所在的表的列名,即你要在哪個或者哪些列上創建索引!
使用索引:索引一般是在查詢時由資料庫優化器自動進行判斷是否使用,就是說就算你在某個列上創建了索引,當你在查詢這個表時資料庫也不一定會使用索引,因為有時候需要查詢的范圍比較大,如全表查詢,這時資料庫優化器會去判斷使用索引和不使用索引哪個效率高,當然是不使用索引效率高啦!所以說一般查詢時是不要指定索引的,不過索引還是得創建的!
雖說查詢時不推薦指定索引,但還是可以指定的:SELECT * FROM stuMarks (INDEX=IX_writtenExam) WHERE writtenExam BETWEEN 60 AND 9
Ⅶ 舉個例子怎樣應用sql中的索引。只會創建,不會應用。
會創建索引就可以了~
在實際的程序運行中,當mysql server收到查詢請求的時候會自動幫你使用索引加速(如果你建立了表欄位索引並且你的查詢中包含了你建立了索引的那個欄位)你的查詢。。。 如果你一定要看看到底mysql有沒有使用到你所創建的索引,那麼可以在你的select語句前面加上explain查看一下mysql的執行計劃
另外,索引雖然能一定程度上加速你的查詢,但是不能濫用,因為表在被插入或者修改的時候都需要額外的新增索引值或者修改索引值,所有欄位都加上索引不是明智的做法,那樣會浪費磁碟空間(索引需要額外的存儲空間),降低更新語句性能
Ⅷ 求大神給個sql聚簇索引的實例,我光看定義看不懂呀 另外聚簇索引和unique索引有啥區別
ALTER TABLE [tra].[tblShipment_CSM] ADD CONSTRAINT [IX_tblShipment_CSM] UNIQUE CLUSTERED
(
[Company] ASC,
[Facility] ASC,
[ConsignmentID] ASC,
[StartingPoint] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
UNIQUE INDEX 和 Primary key 差不多,它要求索引包含的值必須在表中是唯一的,不能重復。CLUSTERED 聚族索引是要求表的數據在存儲時要按索引的先後順序寫入磁碟,這種索引可以減少掃描磁碟的次數,減少IO的讀取。
Ⅸ 創建索引的sql語句怎麼寫
1、CREATE [UNIQUE|CLUSTERED] INDEX INDEX_NAME ON TABLE_NAME(PROPERTY_NAME)
2、其中UNIQUE和CLUSTERED為可選項,分別是建立唯一索引和聚簇索引,具體解釋為:
UNIQUE:表示此索引的每一個索引值只對應唯一的數據。
3、CLUSTERED:表示要建立的索引時聚簇索引,即索引項的順序與表中記錄的物理順序一致的索引組織。
拓展:
1、SQL語言,是結構化查詢語言(StructuredQueryLanguage)的簡稱。SQL語言是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統;同時也是資料庫腳本文件的擴展名。
2、SQL語言是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以具有完全不同底層結構的不同資料庫系統可以使用相同的結構化查詢語言作為數據輸入與管理的介面。SQL語言語句可以嵌套,這使他具有極大的靈活性和強大的功能。
3、結構化查詢語言SQL(STRUCTURED QUERY LANGUAGE)是最重要的關系資料庫操作語言,並且它的影響已經超出資料庫領域,得到其他領域的重視和採用,如人工智慧領域的數據檢索,第四代軟體開發工具中嵌入SQL的語言等。
Ⅹ SQL語言中,如何創建索引想要知道具體實例、、謝謝。
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
[ WITH < index_option > [ ,...n] ]
[ ON filegroup ]
< index_option > ::=
{ PAD_INDEX |
FILLFACTOR = fillfactor |
IGNORE_DUP_KEY |
DROP_EXISTING |
STATISTICS_NORECOMPUTE |
SORT_IN_TEMPDB
}
這是基本的語法,然後再給你幾個實例:
A. 使用簡單索引
下面的示例為 authors 表的 au_id 列創建索引。
SET NOCOUNT OFF
USE pubs
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'au_id_ind')
DROP INDEX authors.au_id_ind
GO
USE pubs
CREATE INDEX au_id_ind
ON authors (au_id)
GO
B. 使用唯一聚集索引
下面的示例為 emp_pay 表的 employeeID 列創建索引,並且強制唯一性。因為指定了 CLUSTERED 子句,所以該索引將對磁碟上的數據進行物理排序。
SET NOCOUNT ON
USE pubs
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'emp_pay')
DROP TABLE emp_pay
GO
USE pubs
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'employeeID_ind')
DROP INDEX emp_pay.employeeID_ind
GO
USE pubs
GO
CREATE TABLE emp_pay
(
employeeID int NOT NULL,
base_pay money NOT NULL,
commission decimal(2, 2) NOT NULL
)
INSERT emp_pay
VALUES (1, 500, .10)
INSERT emp_pay
VALUES (2, 1000, .05)
INSERT emp_pay
VALUES (3, 800, .07)
INSERT emp_pay
VALUES (5, 1500, .03)
INSERT emp_pay
VALUES (9, 750, .06)
GO
SET NOCOUNT OFF
CREATE UNIQUE CLUSTERED INDEX employeeID_ind
ON emp_pay (employeeID)
GO
C. 使用簡單組合索引
下面的示例為 order_emp 表的 orderID 列和 employeeID 列創建索引。
SET NOCOUNT ON
USE pubs
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'order_emp')
DROP TABLE order_emp
GO
USE pubs
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'emp_order_ind')
DROP INDEX order_emp.emp_order_ind
GO
USE pubs
GO
CREATE TABLE order_emp
(
orderID int IDENTITY(1000, 1),
employeeID int NOT NULL,
orderdate datetime NOT NULL DEFAULT GETDATE(),
orderamount money NOT NULL
)
INSERT order_emp (employeeID, orderdate, orderamount)
VALUES (5, '4/12/98', 315.19)
INSERT order_emp (employeeID, orderdate, orderamount)
VALUES (5, '5/30/98', 1929.04)
INSERT order_emp (employeeID, orderdate, orderamount)
VALUES (1, '1/03/98', 2039.82)
INSERT order_emp (employeeID, orderdate, orderamount)
VALUES (1, '1/22/98', 445.29)
INSERT order_emp (employeeID, orderdate, orderamount)
VALUES (4, '4/05/98', 689.39)
INSERT order_emp (employeeID, orderdate, orderamount)
VALUES (7, '3/21/98', 1598.23)
INSERT order_emp (employeeID, orderdate, orderamount)
VALUES (7, '3/21/98', 445.77)
INSERT order_emp (employeeID, orderdate, orderamount)
VALUES (7, '3/22/98', 2178.98)
GO
SET NOCOUNT OFF
CREATE INDEX emp_order_ind
ON order_emp (orderID, employeeID)
D. 使用 FILLFACTOR 選項
下面的示例使用 FILLFACTOR 子句,將其設置為 100。FILLFACTOR 為 100 將完全填滿每一頁,只有確定表中的索引值永遠不會更改時,該選項才有用。
SET NOCOUNT OFF
USE pubs
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'zip_ind')
DROP INDEX authors.zip_ind
GO
USE pubs
GO
CREATE NONCLUSTERED INDEX zip_ind
ON authors (zip)
WITH FILLFACTOR = 100
E. 使用 IGNORE_DUP_KEY
下面的示例為 emp_pay 表創建唯一聚集索引。如果輸入了重復的鍵,將忽略該 INSERT 或 UPDATE 語句。
SET NOCOUNT ON
USE pubs
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'emp_pay')
DROP TABLE emp_pay
GO
USE pubs
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'employeeID_ind')
DROP INDEX emp_pay.employeeID_ind
GO
USE pubs
GO
CREATE TABLE emp_pay
(
employeeID int NOT NULL,
base_pay money NOT NULL,
commission decimal(2, 2) NOT NULL
)
INSERT emp_pay
VALUES (1, 500, .10)
INSERT emp_pay
VALUES (2, 1000, .05)
INSERT emp_pay
VALUES (3, 800, .07)
INSERT emp_pay
VALUES (5, 1500, .03)
INSERT emp_pay
VALUES (9, 750, .06)
GO
SET NOCOUNT OFF
GO
CREATE UNIQUE CLUSTERED INDEX employeeID_ind
ON emp_pay(employeeID)
WITH IGNORE_DUP_KEY
F. 使用 PAD_INDEX 創建索引
下面的示例為 authors 表中的作者標識號創建索引。沒有 PAD_INDEX 子句,SQL Server 將創建填充 10% 的葉級頁,但是葉級之上的頁幾乎被完全填滿。使用 PAD_INDEX 時,中間級頁也填滿 10%。
說明 如果沒有指定 PAD_INDEX,唯一聚集索引的索引頁上至少會出現兩項。
SET NOCOUNT OFF
USE pubs
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'au_id_ind')
DROP INDEX authors.au_id_ind
GO
USE pubs
CREATE INDEX au_id_ind
ON authors (au_id)
WITH PAD_INDEX, FILLFACTOR = 10
G. 為視圖創建索引
下面的示例將創建一個視圖,並為該視圖創建索引。然後,引入兩個使用該索引視圖的查詢。
USE Northwind
GO
--Set the options to support indexed views.
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS ON
GO
--Create view.
CREATE VIEW V1
WITH SCHEMABINDING
AS
SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Revenue, OrderDate, ProctID, COUNT_BIG(*) AS COUNT
FROM dbo.[Order Details] od, dbo.Orders o
WHERE od.OrderID=o.OrderID
GROUP BY OrderDate, ProctID
GO
--Create index on the view.
CREATE UNIQUE CLUSTERED INDEX IV1 ON V1 (OrderDate, ProctID)
GO
--This query will use the above indexed view.
SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev, OrderDate, ProctID
FROM dbo.[Order Details] od, dbo.Orders o
WHERE od.OrderID=o.OrderID AND ProctID in (2, 4, 25, 13, 7, 89, 22, 34)
AND OrderDate >= '05/01/1998'
GROUP BY OrderDate, ProctID
ORDER BY Rev DESC
--This query will use the above indexed view.
SELECT OrderDate, SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev
FROM dbo.[Order Details] od, dbo.Orders o
WHERE od.OrderID=o.OrderID AND DATEPART(mm,OrderDate)= 3
AND DATEPART(yy,OrderDate) = 1998
GROUP BY OrderDate
ORDER BY OrderDate ASC