阅读原文请点击:
http://click.aliyun.com/m/23218/
摘要: 索引维护是数据库日常维护中一项重要的任务,SQL Server的索引维护其实主要围绕下面三个问题进行展开。 索引过多 索引不足 索引碎片率 本文同样从这3个角度出发,介绍一些实用的日常维护方法和工具。
索引维护是数据库日常维护中一项重要的任务,SQL Server的索引维护其实主要围绕下面三个问题进行展开。
索引过多
索引不足
索引碎片率
本文同样从这3个角度出发,介绍一些实用的日常维护方法和工具。
索引过多
索引过多是指每个表上面的非聚集索引很多,并且有些非聚集索引很少用到。 过多的索引,会导致增删数据的效率降低,数据库体积变大,索引以及统计信息的维护成本增加等负面影响,建议定期检查类似的索引,每个表上面的索引最好不要超过10个。
通过下面两个DMV,定期检查索引使用率,通过使用率决定是否需要该索引。sys.dm_db_index_operational_stats这个函数可以给出某个索引上面的insert,update和delete的操作情况。sys.dm_db_index_usage_stats这个视图可以给出访问索引的所有方法的操作概览。
--sys.dm_db_index_operational_stats
SELECT OBJECT_NAME(A.[OBJECT_ID]) AS [OBJECT NAME],
I.[NAME] AS [INDEX NAME],
A.LEAF_INSERT_COUNT,
A.LEAF_UPDATE_COUNT,
A.LEAF_DELETE_COUNT
FROM SYS.DM_DB_INDEX_OPERATIONAL_STATS (NULL,NULL,NULL,NULL ) A
INNER JOIN SYS.INDEXES AS I
ON I.[OBJECT_ID] = A.[OBJECT_ID]
AND I.INDEX_ID = A.INDEX_ID
WHERE OBJECTPROPERTY(A.[OBJECT_ID],'IsUserTable') = 1
1
--sys.dm_db_index_usage_stats
SELECT OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME],
I.[NAME] AS [INDEX NAME],
USER_SEEKS,
USER_SCANS,
USER_LOOKUPS,
USER_UPDATES
FROM SYS.DM_DB_INDEX_USAGE_STATS AS S
INNER JOIN SYS.INDEXES AS I
ON I.[OBJECT_ID] = S.[OBJECT_ID]
AND I.INDEX_ID = S.INDEX_ID
WHERE OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1
2
上述结果中,可以看到,CountryRegionCurrency和AddressType表中,有两个索引,没有使用过。 如果多次检查,这两个索引都还是没有使用过的话,建议将其删除。
索引不足
索引不足是指,要么缺少索引,要么有索引,但是没有覆盖所需的列,查询效果不好。 后者其实也可以归纳到索引不合适中。那么我们来看下,如何才能找到缺失的索引。
SQL Server提供下面4个DMV以供查询missing index的情况。SQL Server重启后,系统视图中的内容就会更新,需要定期的将该信息保存下来。
sys.dm_db_missing_index_details 返回缺失的索引的详细信息。
sys.dm_db_missing_index_group_stats 返回缺失索引组的概要信息。
sys.dm_db_missing_index_groups 返回缺失索引组中有哪些缺失的索引。
sys.dm_db_missing_index_columns 返回表中缺失索引的列。
如何通过检测出来的缺失索引去新建索引,方法参考Using Missing Index Information to Write CREATE INDEX Statements 。
下面语句,在每个库上面执行下面的查询,查看推荐建立的索引,包括创建语句。不过在创建索引前,需要综合考量表中已有的索引,是否有可以合并的情况。
Use DB
SELECT
dm_mid.database_id AS DatabaseID,
dm_migs.avg_user_impact*(dm_migs.user_seeks+dm_migs.user_scans) Avg_Estimated_Impact,
dm_migs.last_user_seek AS Last_User_Seek,
OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) AS [TableName],
'CREATE INDEX [IX_' + OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) + '_'
+ REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.equality_columns,''),', ','_'),'[',''),']','') +
CASE
WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns IS NOT NULL THEN '_'
ELSE ''
END
+ REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.inequality_columns,''),', ','_'),'[',''),']','')
+ ']'
+ ' ON ' + dm_mid.statement
+ ' (' + ISNULL (dm_mid.equality_columns,'')
+ CASE WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns IS NOT NULL THEN ',' ELSE
'' END
+ ISNULL (dm_mid.inequality_columns, '')
+ ')'
+ ISNULL (' INCLUDE (' + dm_mid.included_columns + ')', '') AS Create_Statement
FROM sys.dm_db_missing_index_groups dm_mig
INNER JOIN sys.dm_db_missing_index_group_stats dm_migs
ON dm_migs.group_handle = dm_mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details dm_mid
ON dm_mig.index_handle = dm_mid.index_handle
WHERE dm_mid.database_ID = DB_ID()
ORDER BY Avg_Estimated_Impact DESC
GO
3
创建index时,推荐按照下述顺序进行。
将相等数据行列在最前
将不相等的数据行列在相等的数据行后
将include数据行列在create index语句的include子句中
若要决定相等数据行的顺序,依据选择性排列这些数据行,将选择性最高的数据行排在最前
索引碎片率
新增、删除和修改数据时,数据库会自动维护索引。但时间长了之后,这些操作会造成数据不连续。这会对查找性能产生影响。
首先,观察索引碎片的严重程度。
内部不连续(Internal Fragmentation):数据页中有很多空闲空间;
外部不连续(External Fragmentation):
硬盘中摆放的分页或区不连续,也就是数据表或索引散落在多个范围中,以及存放数据表或者索引的页不是按照实例连续存放的。
逻辑数据顺序和实例在硬盘中的顺序不同。
1. 用DBCC SHOWCONTIG观察数据不连续
create index idCreditCard on CreditCard(CreditCardID) with drop_existing
DBCC showcontig(CreditCard,idCreditCard)
阅读原文请点击:
http://click.aliyun.com/m/23218/
分享到:
相关推荐
总之,SQL Server的索引设计是一个平衡的过程,既要考虑查询速度的提升,也要顾及数据维护的成本。正确的索引策略能够显著提升SQL Server应用的性能,而错误的索引则可能导致相反的结果。因此,深入理解索引的工作...
### SQL Server索引碎片及其解决方法 #### 一、索引碎片的概念 索引是数据库管理系统(DBMS)中一种重要的数据结构,用于提高数据检索的速度。然而,随着时间的推移,索引可能会出现碎片化的情况,这会影响查询...
### SQL Server 索引基础知识知识点汇总 #### 一、记录数据的基本格式 - **数据页作为基础单位**:在 SQL Server 中,数据页是最基本的存储单位,无论是缓存中的数据还是磁盘上的物理存储,都以数据页的形式存在。...
### SQL Server索引设计经验谈 #### 摘要 本文旨在探讨Microsoft SQL Server中的索引设计技巧,尤其是如何通过合理的索引策略来优化查询性能。通过对聚集索引与非聚集索引的选择、索引列的排序方式、填充因子的...
在SQL Server 2005中,数据库管理和操作是核心功能之一。以下是一些关于SQL Server 2005常用语法的关键知识点: 1. **数据库安装**:安装SQL ...掌握这些基础语法,能帮助管理员有效管理和维护SQL Server 2005环境。
以下是对"SQL Server索引管理之六大铁律"的详细解释: **铁律一:天下没有免费的午餐,使用索引是需要付出代价的** 建立和维护索引都需要消耗资源。创建索引时,数据库管理员需要进行规划和设计,而随着表中数据的...
除此之外,免费的第三方工具如SQL Server Compact Toolbox 和 SQL Server Express Management Studio 也是开发者常用的选择。SQL Server Compact Toolbox适用于处理SQL Server Compact Edition数据库,而SQL Server ...
### SQL Server 2008 查找缺失索引 #### 一、理解缺失索引及其查询方法 在SQL Server 2008中,优化数据库性能的一个重要方面就是确保索引设计合理。当数据库管理系统(DBMS)检测到某个查询在没有合适索引支持的...
5. **模板与片段**:预定义的SQL模板和自定义代码片段,让我们能够快速访问常用的SQL语句,比如创建表、索引、视图等,进一步提高工作效率。 6. **版本控制集成**:Sql Prompt与常见的版本控制系统(如Git)无缝...
SQL Server维护手册是一份详尽的指南,涵盖了数据库系统的核心维护任务,主要针对SQL Server这一广泛应用的关系型数据库管理系统。这份手册旨在帮助管理员有效地管理和优化SQL Server环境,确保系统的稳定性和性能。...
以上是SQL Server中SQL语句的基础概念和常用操作,这些语句构成了SQL Server数据库管理的基础,使得我们能够高效地操作和管理数据库中的数据。了解并熟练掌握这些语句,对于数据库开发和维护至关重要。
除此之外,还有其他重要概念,如JOIN操作、索引管理、事务处理、视图和存储过程的创建与调用等,都是SQL Server数据库管理员和开发人员需要掌握的核心技能。在实际工作中,不断学习和实践这些知识,将使你在SQL ...
本篇将深入探讨MS SQL Server的一些常用知识和方法,以帮助初学者或数据库新手快速掌握其基本操作。 1. **数据库维护**: 数据库的维护包括定期备份、恢复、性能优化和安全性管理。备份是防止数据丢失的关键,可以...
以下是对"sql server性能优化总结"的详尽解读: 1. **查询优化**: - **索引优化**:索引是提高查询速度的关键。正确创建非聚簇和聚簇索引,根据查询模式选择合适的覆盖索引,以及定期维护索引(如重建和重新组织...
MySQL常用的数据类型如`TEXT`在SQL Server中对应的是`VARCHAR(MAX)`或`NVARCHAR(MAX)`。在迁移过程中,描述中提到的`text`类型在MySQL中存储大量文本数据,但在迁移到SQL Server时,如果没有预处理,可能会遇到中文...
下面介绍几种常用的SQL Server查询优化方法: 1. **合理使用索引**:索引可以显著提高查询效率。创建索引后,可以通过索引来快速查找数据,而不是逐行扫描。然而,索引的创建和维护会增加数据库的时间和空间开销。...
以上总结了SQL Server中常用的SQL语句,涵盖了数据库管理、表操作、基本查询到高级查询的各种场景,对于日常开发和维护SQL Server数据库非常有帮助。掌握这些语句,能够显著提高数据处理的效率和灵活性。
### SQL Server 2000 性能调优与维护系列知识点详解 #### 1. 彻底掌握SQL Server 2000体系结构(一)- 引擎结构 - **引擎结构概述**:本课程重点介绍了SQL Server 2000的核心组件及其工作原理。SQL Server 2000的...
SQLServer2005管理工具.msi这个文件很可能是安装SQL Server 2005管理工具的 MSI 安装程序。下载并运行此文件,按照向导提示完成安装,即可在本地计算机上安装和使用这些管理工具。 总结来说,SQL Server 2005管理...
### MS SQL Server 查询优化方法详解 #### 一、引言 在数据库管理与维护中,查询性能优化是一项至关重要的工作。对于使用MS SQL Server的企业和个人来说,了解并掌握查询优化技巧能够显著提升系统的响应速度与整体...