笔记135 聚集键的选择/测试,关于查询效率和碎片容忍度的选择

笔记135 聚集键的选择/测试,关于查询效率和碎片容忍度的选择

 1 --聚集键的选择/测试,关于查询效率和碎片容忍度的选择
 2 --(即便碎片度很高,在查询关键字上建立聚集索引还是值得的
 3 
 4 
 5 
 6 --RAND()生成 1以内的随机数 例如:0.703350438790276
 7 --SELECT SUBSTRING(CAST(RAND()+0.1 AS VARCHAR(10)),3,3); 
 8 
 9 --SELECT CAST(NEWID() as varchar(50));
10 
11 USE pratice
12 IF (OBJECT_ID('TABLE1') IS NOT NULL)
13 DROP TABLE TABLE1
14 IF (OBJECT_ID('TABLE2') IS NOT NULL)
15 DROP TABLE TABLE2
16 go
17 
18 
19 --测试表1
20 CREATE TABLE [TABLE1](
21      [ID] [int] IDENTITY(1,1) NOT NULL,
22      [CATEGORYID] [varchar](10) NULL,
23      [OtherCol1] [varchar](200) NULL,
24      [OtherCol2] [varchar](200) NULL
25 )
26 --聚集索引建立在自增列上,最大程度上减少碎片
27 CREATE CLUSTERED INDEX INDEX_ID ON TABLE1([ID])
28 --因为要以categoryid作为查询字段,在categoryid上建立非聚集索引
29 CREATE INDEX INDEX_CATEGORYID ON TABLE1(CATEGORYID)
30 
31 --测试表2
32 CREATE TABLE [TABLE2](
33      [ID] [int] IDENTITY(1,1) NOT NULL,
34      [CATEGORYID] [varchar](10) NULL,
35      [OtherCol1] [varchar](200) NULL,
36      [OtherCol2] [varchar](200) NULL
37 )
38 --聚集索引建立在随即列上,同时也存在重复性
39 CREATE CLUSTERED INDEX INDEX_CATEGORYID ON [TABLE2]([CATEGORYID])
40 go
41 
42 
43 TRUNCATE TABLE TABLE1
44 TRUNCATE TABLE TABLE2
45 go
46 
47 
48 DECLARE @I INT,@CategoryID varchar(20),@OtherCol varchar(50)
49 SET @I=1
50 WHILE @I<=1000
51 BEGIN
52      --模拟一个商品ID,随即生成,0001——9999
53      set @CategoryID=SUBSTRING(CAST(RAND()+0.1 AS VARCHAR(10)),3,3);
54      set @OtherCol=CAST(NEWID() as varchar(50));
55      INSERT INTO TABLE1 VALUES (@CategoryID,@OtherCol,@OtherCol) ;
56      INSERT INTO TABLE2 VALUES (@CategoryID,@OtherCol,@OtherCol) ;    
57      set @I=@I+1;
58 END
59 
60 --按msdn上面的说法,如果碎片比小于30%,我们可以重新组织索引,如果碎片比大于等于30%,我们可以选择重新生成索引。
61 --动态函数sys.dm_db_index_physical_stats
62 --查看当前库的所有表的所有索引碎片
63 SELECT * FROM sys.dm_db_index_physical_stats(DB_ID( ),NULL ,NULL ,NULL,NULL)
64 
65 SELECT * FROM sys.dm_db_index_physical_stats( DB_ID('DBTEST'),OBJECT_ID('table1'),OBJECT_ID('INDEX_CATEGORYID'),NULL,NULL)
66 SELECT * FROM sys.dm_db_index_physical_stats( DB_ID('DBTEST'),OBJECT_ID('table2'),OBJECT_ID('INDEX_CATEGORYID'),NULL,NULL)
67 
68 --下面来查询
69 UPDATE STATISTICS TABLE1[INDEX_ID]
70 UPDATE STATISTICS TABLE1[INDEX_CATEGORYID]
71 UPDATE STATISTICS TABLE2[INDEX_CATEGORYID]
72 
73 DBCC DROPCLEANBUFFERS
74 SET STATISTICS IO ON
75 
76 SELECT * FROM TABLE1 WHERE CATEGORYID='666'
77 SELECT * FROM TABLE2 WHERE CATEGORYID='666'
78 
79 
80 --DBCC命令查看索引碎片
81 USE GPOSDB
82 GO
83 DBCC SHOWCONTIG WITH tableresults,ALL_INDEXES
84 GO 

 

posted @ 2013-08-03 22:59  桦仔  阅读(345)  评论(0编辑  收藏  举报