学习笔记(十)——索引的应用技巧和注意事项学习
一、建立包含列的非汇集索引(将空间上的优点转变成时间上的优点)优化
建立代码以下: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);
查询结果以下: