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