學習筆記(十)——索引的應用技巧和注意事項

學習筆記(十)——索引的應用技巧和注意事項學習

一、建立包含列的非彙集索引(將空間上的優點轉變成時間上的優點)優化

建立代碼以下: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);    

 

 

查詢結果以下:

相關文章
相關標籤/搜索