学习笔记(十)——索引的应用技巧和注意事项
学习笔记(十)——索引的应用技巧和注意事项
1、创建包含列的非聚集索引(将空间上的优势转变成时间上的优势)
创建代码如下:
select*fromDimEmployee; CREATENONCLUSTEREDINDEXcustomernameONDimCustomer (CustomerAlternateKeyASC) INCLUDE(LastName ,FirstName)
例如创建一个客户的名字非聚集索引
CREATENONCLUSTEREDINDEXnameONDimCustomer (LastNameASC ,FirstNameASC) //①查询姓名的开销(代码) Selectc.*fromDimCustomerasc wherec.FirstName='Jon'andc.LastName='Yang'
实际开销结果如下:
//②查询姓的开销(代码) Selectc.*fromDimCustomerasc wherec.LastName='Yang'
实际开销结果如下:
//③查询名的开销(代码) Selectc.*fromDimCustomerasc wherec.FirstName='Jon'
实际开销为下面的结果:
对比三面的三个开销结果,可以看得出来建立索引的查询是有先来后到的,索引的查询要包含前面的N列才能获益
因此进行优化的结果应该是分别创建两个索引,一个代表姓,一个代表名。(代码如下)
CREATENONCLUSTEREDINDEXFnameONDimCustomer( FirstNameASC)//创建姓的非聚集索引 CREATENONCLUSTEREDINDEXLnameONDimCustomer( LastNameASC)//创建名的非聚集索引
2、
为一张表建立主键(代码)
ALTERTABLEDimProduct
ADO
COMSTRAINT
pk_DimProduct_ProductKey
PRIMARY (ProductKey);
查询产品英文名为Jam的产品信息(代码)
selectP.*fromDimProductASP whereP.EnglishProductNamelike'%Jam%'
开销如下:
②查询产品英文名为Jam的产品信息(代码)
selectP.*fromDimProductASP whereLEFT(P.EnglishProductName,4)='Thin'
有上述两个开销结果可以看出来,如果进行了运算,索引就没没办法从获益;
优化结果:应当使用and等进行连接,进行优化,避免使用计算。
3、
SELECT O.SalesOrderNumber ,O.SalesOrderDetailID FROM tb_Customer2ASC JOINtb_Order2ASOONC.ID=O.CustomerID WHERE C.City='Chicago';//合并循环 C.City='Paris';//嵌套循环
4、索引的更新以及删除都会产生内部碎片,这样的碎片往往难以填充,新的索引大小要是大有碎片的大小,就会导致索引拆分页
外部的碎片主要由两种,一种是逻辑顺序和物理顺序不一致,还有一种是索引页不连续
例如:
SELECTTOP 45 O.* FROM DimProductASO WHERE O.ProductKey%2=1;
DBCCIND ('AdventureWorksDW2008R2' ,'DimProduct' ,1);
查询结果如下: