- 索引查找信息
在非聚集索引里,會為每條記錄存儲一份非聚集索引索引鍵的值和一份聚集索引索引鍵
【在沒有聚集索引的表格里,是RID值指向數據頁面,有聚集索引的話指向聚集索引的鍵(在不使用include時)】
所以在這里,每條記錄都會有一份[UnitPrice]和[SalesOrderDetailID]記錄,按照[UnitPrice]的順序存放
SELECT Types FROM dbo.News WHERE Types>10
計划:索引查找通過News_CL非聚集索引

返回的字段包含沒有建立索引的字段,SQLSERVER就要先在非聚集索引上找到所有[Types]大於10的記錄,然后再根據[NewsID]的值找到存儲在聚集索引上的詳細數據。這個過程可以稱為“bookmark loolup” 書簽查找(書簽查找很難避免)
SELECT Types,Contents FROM dbo.News WHERE Types>10
計划:聚集索引掃描通過PK_News主鍵


-------------------------------------再再總結------------------------------------------------------
(1)where 后面(篩選的字段):決定你建索引的時候要建的字段的范圍,如果某個字段經常作為篩選字段那么可以在他上面建立索引
1 CREATE CLUSTERED INDEX SalesOrderDetail_test_CL ON [dbo].[SalesOrderDetail_test]([SalesOrderDetailID])
(2)where前面(返回的字段):決定你的表數據的查找速度,根據聚集索引來返回其他字段的值,沒有聚集索引的話到數據頁面里去找字段值
(3)聚集索引掃描:where后面的字段是沒有建立索引【包括非聚集索引(表格上要有非聚集索引)和聚集索引】的字段
但是表格上有聚集索引 ,不管表格上有沒有非聚集索引
(3)非聚集索引掃描:where后面的字段是沒有建立索引(非聚集索引)的字段 ,但是表格上有非聚集索引但沒有聚集索引
(4)表掃描:where后面的字段是沒有建立索引的字段 並且表格上沒有聚集索引和非聚集索引
(5)書簽查找:where后面的字段建立了索引(不管是聚集索引還是非聚集索引),但是where前面返回的字段中有些沒有建立索引
(不管是聚集索引還是非聚集索引)
- 什么時候使用統計信息,統計信息幫助完成復雜度計算,選擇正確執行方式

為了以盡可能快的速度完成語句,光有索引是不夠的。對於同一句話,SQLSERVER有很多種方法來完成他。
有些方法適合於數據量比較小的時候,有些方法適合於數據量比較大的時候。同一種方法,在數據量不同的時候,
復雜度會有非常大的差別。索引只能幫助SQLSERVER找到符合條件的記錄。SQLSERVER還需要知道每一種操作
所要處理的數據量有多少,從而估算出復雜度,選取一個代價最小的執行計划。說得通俗一點,SQLSERVER要能夠
知道數據是“長得什么樣”的才能用最快方法完成指令
統計信息創建:
主要有3種情況
(1)在索引創建時,SQLSERVER會自動在索引所在的列上創建統計信息,所以從某種角度講,索引的作用是雙重的,
他自己能夠幫助SQLSERVER快速找到數據,而他上面的統計信息,也能夠告訴SQLSERVER數據的分布情況
補充一下:索引重建的時候也會更新表的統計信息,所以有時候查詢變慢的時候重建一下索引查詢變快了統計信息的更新也是原因之一
(2)DBA也可以通過之類的語句手動創建他認為需要的統計信息 CREATE STATISTICS
如果打開了auto create statistics自動創建統計信息,一般來講很少需要手動創建
(3)當SQSERVERL想要使用某些列上的統計信息,發現沒有的時候,“auto create statistics 自動創建統計信息”
會讓SQLSERVER自動創建統計信息
例如,當語句要在某個(或者幾個)字段上做過濾,或者要拿他們和另外一張表做聯接(join) SQLSERVER要估算最后從這張表會返回多少記錄。
這時候就需要一個統計信息的支持。如果沒有,SQLSERVER會自動創建一個
在打開“auto create statistics 自動創建統計信息”的數據庫上,一般不需要擔心SQLSERVER沒有足夠的統計信息來選擇執行計划。
這一點完全交給SQLSERVER管理就可以了
