SQL Server怎么找出数据库中没有索引的表
这篇文章主要讲解了“SQL Server怎么找出数据库中没有索引的表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL Server怎么找出数据库中没有索引的表”吧!
在SQL Server数据库的维护中,我们经常需要巡检,找出一些没有索引的表,然后根据实际情况判断是否需要增加索引。下面分享一个脚本,如何找出当前数据库中没有索引的表信息。
SELECTDISTINCT@@SERVERNAMEAS[SERVER_NAME],DB_NAME()AS[DB_NAME],so.object_idAS[OBJECT_ID],SCHEMA_NAME(so.schema_id)+'.'+OBJECT_NAME(so.object_id)AS[TABLE_NAME],MAX(dmv.rows)AS[APPROXIMATE_ROWS],MAX(d.ColumnCount)AS[COLUMN_COUNT]FROMsys.objectsso(NOLOCK)JOINsys.indexessi(NOLOCK)ONso.object_id=si.object_idANDso.typeIN(N'U',N'V')JOINsysindexesdmv(NOLOCK)ONso.object_id=dmv.idANDsi.index_id=dmv.indidFULLOUTERJOIN(SELECTobject_id,COUNT(1)ASColumnCountFROMsys.columns(NOLOCK)GROUPBYobject_id)dONd.object_id=so.object_idWHEREso.is_ms_shipped=0ANDso.object_idNOTIN(SELECTmajor_idFROMsys.extended_properties(NOLOCK)WHEREname=N'microsoft_database_tools_support')ANDINDEXPROPERTY(so.object_id,si.name,'IsStatistics')=0GROUPBYso.schema_id,so.object_idHAVING(CASEOBJECTPROPERTY(MAX(so.object_id),'TableHasClustIndex')WHEN0THENCOUNT(si.index_id)-1ELSECOUNT(si.index_id)END=0)ORDERBY[APPROXIMATE_ROWS]DESC;
上面脚本只能查询当前数据库中没有索引的表,我们知道,生产环境中,一个实例下面往往有多个用户数据库,我们需要采集每个数据库中没有索引的表信息,那么上面脚本明显有点硬伤,所以,重写了这个脚本。
IFEXISTS(SELECT*FROMtempdb.dbo.sysobjectsWHEREid=OBJECT_ID('tempdb.dbo.#Database'))BEGINDROPTABLE#Database;ENDCREATETABLE#Database(database_idINT,database_nameNVARCHAR(128));INSERTINTO#DatabaseSELECTdatabase_id,nameFROMsys.databasesWHEREstate_desc='ONLINE'ANDnameNOTIN('master','msdb','tempdb','model','distribution')DECLARE@database_nameNVARCHAR(128);DECLARE@database_idINT;DECLARE@cmdTextNVARCHAR(MAX);SET@database_name='';SET@database_id=1;IFEXISTS(SELECT*FROMtempdb.dbo.sysobjectsWHEREid=OBJECT_ID('tempdb.dbo.#TAB_NO_INDEX_INFO'))BEGINDROPTABLE#TAB_NO_INDEX_INFO;ENDCREATETABLE#TAB_NO_INDEX_INFO([SERVER_NAME][NVARCHAR](32)NULL,[INSTANCE_NAME][NVARCHAR](64)NULL,[DATABASE_NAME][NVARCHAR](32)NULL,[TABLE_NAME][NVARCHAR](128)NULL,[OBJECT_ID][INT]NULL,[APPROXIMATE_ROWS][INT]NULL,[COLUMN_COUNT][INT]NULL);WHILE(1=1)BEGINSELECTTOP1@database_id=database_id,@database_name=database_nameFROM#DatabaseWHEREdatabase_id>@database_id--nextdatabase_namegreaterthan@database_idORDERBYdatabase_id--database_idorder--exitloopifnomorenamegreaterthanthelastoneusedIf@@rowcount=0BreakSET@cmdText='USE'+@database_name+';--GOINSERTINTO#TAB_NO_INDEX_INFO(SERVER_NAME,INSTANCE_NAME,DATABASE_NAME,TABLE_NAME,OBJECT_ID,APPROXIMATE_ROWS,COLUMN_COUNT)SELECTDISTINCTCAST(SERVERPROPERTY(''MachineName'')ASNVARCHAR(32))AS[SERVER_NAME],@@SERVICENAMEAS[INSTANCE_NAME],DB_NAME()AS[DATABASE_NAME],SCHEMA_NAME(so.schema_id)+''.''+OBJECT_NAME(so.object_id)AS[TABLE_NAME],so.object_idAS[OBJECT_ID],MAX(dmv.rows)AS[APPROXIMATE_ROWS],MAX(d.ColumnCount)AS[COLUMN_COUNT]FROMsys.objectsso(NOLOCK)JOINsys.indexessi(NOLOCK)ONso.object_id=si.object_idANDso.typeIN(N''U'',N''V'')JOINsysindexesdmv(NOLOCK)ONso.object_id=dmv.idANDsi.index_id=dmv.indidFULLOUTERJOIN(SELECTobject_id,COUNT(1)ASColumnCountFROMsys.columns(NOLOCK)GROUPBYobject_id)dONd.object_id=so.object_idWHEREso.is_ms_shipped=0ANDso.object_idNOTIN(SELECTmajor_idFROMsys.extended_properties(NOLOCK)WHEREname=N''microsoft_database_tools_support'')ANDINDEXPROPERTY(so.object_id,si.name,''IsStatistics'')=0GROUPBYso.schema_id,so.object_idHAVING(CASEOBJECTPROPERTY(MAX(so.object_id),''TableHasClustIndex'')WHEN0THENCOUNT(si.index_id)-1ELSECOUNT(si.index_id)END=0)ORDERBY[APPROXIMATE_ROWS]DESC;'PRINT@cmdText;EXEC(@cmdText);--EXECSP_EXECUTESQL@cmdText,N'@database_nameNVARCHAR(32)',@database_nameDeleteDbFrom#DatabaseDbWHEREdatabase_id=@database_id;ENDSELECT*FROM#TAB_NO_INDEX_INFOORDERBYAPPROXIMATE_ROWSDESC;--找出数据量超过1000行没有索引信息的表SELECT*FROM#TAB_NO_INDEX_INFOWHEREAPPROXIMATE_ROWS>1000ORDERBYAPPROXIMATE_ROWSDESC
当你维护了很多SQL Server数据库时,使用上面脚本到每台SQL Server实例上跑一次,也是一件非常麻烦耗时的事情,所以还是需要自动化作业处理,定时使用Python脚本去每台SQL Server实例上采集数据存储下来,然后DBA只需做好两件事情:监控采集数据和分析处理数据。这里就不贴Python脚本了,其实就是循环所有SQL Server实例,运行上面脚本,将采集到的相关数据存储起来。
感谢各位的阅读,以上就是“SQL Server怎么找出数据库中没有索引的表”的内容了,经过本文的学习后,相信大家对SQL Server怎么找出数据库中没有索引的表这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。