笔记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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!