人们使用monProcessObjectActivity表来确定未使用的索引。这是一个很好的方法,因为未使用的索引可能会妨碍dml语句的性能。尽管如此,我看到人们使用UsedCount或lastUsedDate作为查找未使用索引的标准。使用UsedCount有问题,使用lastuseddate标准有很多问题。
首先让我们看看lastuseddate有什么问题:人们通常会检查索引是否在最近60天左右使用。我认为这是错误的,因为索引可能对每季度、半年或每年运行的查询非常有用。因此,您不应该使用日期条件,而是查看UsedCount/OptSelectCount,然后进一步分析索引的用法,只有在未使用时才删除它。
还有,有时人们在服务器上运行临时查询,可能会使用一些索引,但这是人们很少运行的,但现在最后使用的日期是昨天,这样的索引不会出现在您要删除的条件中,但是如果您分析它们并看到它被使用过一次或类似的情况,您可能会决定删除它。因此,在删除任何索引之前,请始终分析这些因素。
使用Next计数:
此监视表中有两列。UsedCount和OptSelectCount。首先让我们看看这些列是什么意思。OptSelectCount:这意味着优化器已决定将此索引用于查询。但这并不意味着索引实际上是由该查询访问的。如果您将看到plancost输出,并且在那里看到索引名称,则表示优化器选择了此索引。
2。UsedCount:这意味着优化器已决定将此索引用于查询,并且已访问该索引。您可以通过查看scancount(前提是plancost提到这个索引是由优化器选择的)来检查优化器是否访问了这个索引如果它是0,那么这个索引就没有被访问,否则它就被访问了。在一个查询的嵌套循环连接的情况下,optselectcount将增加1,而usedcount将增加扫描次数。
现在,让我们看看它的作用。
–首先创建一个表
删除表mytab\u 1gocreate表mytab\u 1(col1 int identity not null,col2 char(100)not null)进入mytab\u 1(col2)从syscolumns中选择top 5000 newid(1)在mytab\u 1(col1)上创建非聚集索引idx\u col1转到
–此时我们应该有0 UsedCount和0 optselectcount作为Indid 2
select*from master..monOpenObjectActivity其中DBID=db\u id()和Object\u name(ObjectID,DBID)='mytab\u 1'go
-我正在尝试5001,即使该值不存在,但sybase不会知道,除非它访问索引。如果它访问索引,使用的计数和选择的计数都将是1.
–现在让我们使用col1查询表的值,比如5000.
设置统计io,时间,计划成本
转到
从mytab\u 1中选择*其中col1=5000go
设置统计io,时间,plancost off
go
===============================================
Lava操作符树====================
发射(VA=1)r:1 er:1 cpu:0
/IndexScanidx\u col1(VA=0)r:1 er:1l:3 el:3p:0 ep:3
=====================================表:mytab\u 1逻辑读取计数1,逻辑读取:(常规扫描=3)apf=0 total=3),大数据产品,物理读取:(regular=0 apf=0 total=0),apf IOs used=0
select*from master..monOpenObjectActivity其中DBID=db\u id()和Object\u name(ObjectID,DBID)='mytab\u 1'go
–您将看到OptSelectCount为1,UsedCount为1。这是预期的,因为Plancost显示用于选择的索引selectcount增加了1,然后有一个索引扫描来获取数据,因此它被使用,UsedCount增加了1.
–现在重建索引drop index mytab_1.idx_col1在mytab_1(col1)上创建非聚集索引idx_col1转到
select*from master..monOpenObjectActivity whereDBID=db\u id()和Object\u name(ObjectID,DBID)='mytab\u 1'go
–used count和optselectcount都是0,因为还没有使用索引。
-现在我正在创建一个临时表,免费的数据分析软件,然后使用该临时表从mytab\u 1中选择数据,该表将有0行。选择5000作为col1进入#mytabgodelete from#mytabgo
select*from#mytabgo
select*frommaster..monopeObjectActivity其中DBID=db\u id()和Object\u name(ObjectID,DBID)='mytab\u 1'go
-您将看到optselectcount和UsedCount为0
设置statistics io,time,plancost off
go
select*from#mytab mt inner join mytab\u 1 mt1 oncol1山=mt1.col1go
设置统计io、时间、计划成本关
go
–统计输出io,时间,计划成本
========================Lava运算符树=================
发射(VA=3)r:0 er:1 cpu:0
/NestLoopJoin内部连接(VA=2)r:0 er:1
/\TableScan IndexScan#mytab(mt)idxŠU col1(mt1)(VA=0)(VA=1)r:0 er:1 r:0 er:1l:1 el:1 l:0 el:3p:0ep:1 p:0 ep:3
==========================================================表:#mytab(mt)扫描计数1,逻辑读取:(regular=1 apf=0 total=1),物理读取:(regular=0 apf=0 total=0),物联网公司排名,apf IOs used=0表:mytabşu 1(mt1)扫描计数0,逻辑读取:(regular=0 apf=0 total=0),物理读取:(regular=0 apf=0 total=0),apf IOs used=0此命令的总写入数:0
select*from master..monOpenObjectActivity其中DBID=db\u id()和Object\u name(ObjectID,DBID)='mytab\u 1'go