學習筆記(十)——索引的應用技巧和注意事項學習
一、建立包含列的非彙集索引(將空間上的優點轉變成時間上的優點)優化
建立代碼以下:spa
select*fromDimEmployee; CREATENONCLUSTEREDINDEXcustomernameONDimCustomer (CustomerAlternateKeyASC) INCLUDE(LastName ,FirstName)
例如建立一個客戶的名字非彙集索引3d
CREATENONCLUSTEREDINDEXnameONDimCustomer (LastNameASC ,FirstNameASC) //①查詢姓名的開銷(代碼) Selectc.*fromDimCustomerasc wherec.FirstName='Jon'andc.LastName='Yang'
實際開銷結果以下:code
//②查詢姓的開銷(代碼) Selectc.*fromDimCustomerasc wherec.LastName='Yang'
實際開銷結果以下:blog
//③查詢名的開銷(代碼) Selectc.*fromDimCustomerasc wherec.FirstName='Jon'
實際開銷爲下面的結果:索引
對比三面的三個開銷結果,能夠看得出來創建索引的查詢是有先來後到的,索引的查詢要包含前面的N列才能獲益產品
所以進行優化的結果應該是分別建立兩個索引,一個表明姓,一個表明名。(代碼以下)it
CREATENONCLUSTEREDINDEXFnameONDimCustomer( FirstNameASC)//建立姓的非彙集索引 CREATENONCLUSTEREDINDEXLnameONDimCustomer( LastNameASC)//建立名的非彙集索引
二、ast
爲一張表創建主鍵(代碼)
ALTERTABLEDimProduct
ADO
COMSTRAINT
pk_DimProduct_ProductKey
PRIMARY (ProductKey);
查詢產品英文名爲Jam的產品信息(代碼)
selectP.*fromDimProductASP whereP.EnglishProductNamelike'%Jam%'
開銷以下:
②查詢產品英文名爲Jam的產品信息(代碼)
selectP.*fromDimProductASP whereLEFT(P.EnglishProductName,4)='Thin'
有上述兩個開銷結果能夠看出來,若是進行了運算,索引就沒沒辦法從獲益;
優化結果:應當使用and等進行鏈接,進行優化,避免使用計算。
三、
SELECT O.SalesOrderNumber ,O.SalesOrderDetailID FROM tb_Customer2ASC JOINtb_Order2ASOONC.ID=O.CustomerID WHERE C.City='Chicago';//合併循環 C.City='Paris';//嵌套循環
四、索引的更新以及刪除都會產生內部碎片,這樣的碎片每每難以填充,新的索引大小要是大有碎片的大小,就會致使索引拆分頁
外部的碎片主要由兩種,一種是邏輯順序和物理順序不一致,還有一種是索引頁不連續
例如:
SELECTTOP 45 O.* FROM DimProductASO WHERE O.ProductKey%2=1;
DBCCIND ('AdventureWorksDW2008R2' ,'DimProduct' ,1);
查詢結果以下: