无论何时对基础数据执行插入、更新或删除操作,SQL Server 数据库引擎都会自动维护索引。随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片)。当索引包含的页中的逻辑排序(基于键值)与数据文件中的物理排序不匹配时,就存在碎片。碎片非常多的索引可能会降低查询性能,导致应用程序响应缓慢。下面是一些简单的查询索引的sql。MSSQL的 DBA_Huangzj  提供。

判断无用的索引:

  1. __何问起 hovertree.com
  2. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  3. SELECT TOP 30
  4. DB_NAME() AS DatabaseName ,
  5. '[' + SCHEMA_NAME(o.Schema_ID) + ']' + '.' + '['
  6. + OBJECT_NAME(s.[object_id]) + ']' AS TableName ,
  7. i.name AS IndexName ,
  8. i.type AS IndexType ,
  9. s.user_updates ,
  10. s.system_seeks + s.system_scans + s.system_lookups AS [System_usage]
  11. FROM sys.dm_db_index_usage_stats s
  12. INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
  13. AND s.index_id = i.index_id
  14. INNER JOIN sys.objects o ON i.object_id = O.object_id
  15. WHERE s.database_id = DB_ID()
  16. AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0
  17. AND s.user_seeks = 0
  18. AND s.user_scans = 0
  19. AND s.user_lookups = 0
  20. AND i.name IS NOT NULL
  21. ORDER BY s.user_updates DESC

判断 哪些索引缺失:

  1. __何问起 hovertree.com
  2. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  3. SELECT TOP 30
  4. ROUND(s.avg_total_user_cost * s.avg_user_impact * ( s.user_seeks
  5. + s.user_scans ),
  6. 0) AS [Total Cost] ,
  7. s.avg_total_user_cost * ( s.avg_user_impact / 100.0 ) * ( s.user_seeks
  8. + s.user_scans ) AS Improvement_Measure ,
  9. DB_NAME() AS DatabaseName ,
  10. d.[statement] AS [Table Name] ,
  11. equality_columns ,
  12. inequality_columns ,
  13. included_columns
  14. FROM sys.dm_db_missing_index_groups g
  15. INNER JOIN sys.dm_db_missing_index_group_stats s ON s.group_handle = g.index_group_handle
  16. INNER JOIN sys.dm_db_missing_index_details d ON d.index_handle = g.index_handle
  17. WHERE s.avg_total_user_cost * ( s.avg_user_impact / 100.0 ) * ( s.user_seeks
  18. + s.user_scans ) > 10
  19. ORDER BY [Total Cost] DESC ,
  20. s.avg_total_user_cost * s.avg_user_impact * ( s.user_seeks
  21. + s.user_scans ) DESC

看看那些索引维护成本很高 通俗的说就是更新次数大于使用这个索引的次数

  1. __何问起 hovertree.com
  2. SELECT TOP 20
  3. DB_NAME() AS DatabaseName ,
  4. '[' + SCHEMA_NAME(o.Schema_ID) + ']' + '.' + '['
  5. + OBJECT_NAME(s.[object_id]) + ']' AS TableName ,
  6. i.name AS IndexName ,
  7. i.type AS IndexType ,
  8. ( s.user_updates ) AS update_usage ,
  9. ( s.user_seeks + s.user_scans + s.user_lookups ) AS retrieval_usage ,
  10. ( s.user_updates ) - ( s.user_seeks + user_scans + s.user_lookups ) AS maintenance_cost ,
  11. s.system_seeks + s.system_scans + s.system_lookups AS system_usage ,
  12. s.last_user_seek ,
  13. s.last_user_scan ,
  14. s.last_user_lookup
  15. FROM sys.dm_db_index_usage_stats s
  16. INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
  17. AND s.index_id = i.index_id
  18. INNER JOIN sys.objects o ON i.object_id = O.object_id
  19. WHERE s.database_id = DB_ID('{0}')
  20. AND i.name IS NOT NULL
  21. AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0
  22. AND ( s.user_seeks + s.user_scans + s.user_lookups ) > 0
  23. ORDER BY maintenance_cost DESC

常常使用的索引查看 看看你常用使用的索引是否建立的合理

  1. __何问起 hovertree.com
  2. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  3. SELECT TOP 20
  4. DB_NAME() AS DatabaseName
  5. , '['+SCHEMA_NAME(o.Schema_ID)+']'+'.'+'['+OBJECT_NAME(s.[object_id]) +']'AS TableName
  6. , i.name AS IndexName
  7. , i.type as IndexType
  8. , (s.user_seeks + s.user_scans + s.user_lookups) AS Usage
  9. , s.user_updates
  10. FROM sys.dm_db_index_usage_stats s
  11. INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
  12. AND s.index_id = i.index_id
  13. INNER JOIN sys.objects o ON i.object_id = O.object_id
  14. WHERE s.database_id = DB_ID()
  15. AND i.name IS NOT NULL
  16. AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0
  17. ORDER BY Usage DESC

决定使用哪种碎片整理方法的第一步是分析索引以确定碎片程度 DBCC SHOWCONTIG(表名) WITH ALL_INDEXES 先查碎片信息。

重新组织:

若要重新组织一个或多个索引,可以使用带 REORGANIZE 子句的 ALTER INDEX 语句。此语句可以替代 DBCC INDEXDEFRAG 语句。若要重新组织已分区索引的单个分区,可以使用 ALTER INDEX 的 PARTITION 子句。

重新组织索引是通过对叶页进行物理重新排序,使其与叶节点的逻辑顺序(从左到右)相匹配,从而对表或视图的聚集索引和非聚集索引的叶级别进行碎片整理。使页有序可以提高索引扫描的性能。索引在分配给它的现有页内重新组织,而不会分配新页。如果索引跨多个文件,将一次重新组织一个文件,不会在文件之间迁移页。

重新组织还会压缩索引页。如果还有可用的磁盘空间,将删除此压缩过程中生成的所有空页。压缩基于 sys.indexes 目录视图中的填充因子值。

重新组织进程使用最少的系统资源。而且,重新组织是自动联机执行的。该进程不持有长期阻塞锁,所以不会阻止运行查询或更新。

索引碎片不太多时,可以重新组织索引。请参阅上面的表,了解有关碎片的指导原则。不过,如果索引碎片非常多,重新生成索引则可以获得更好的结果。

重新组织索引时,除了重新组织一个或多个索引外,默认情况下还将压缩聚集索引或基础表中包含的大型对象数据类型 (LOB)。数据类型 image、text、ntext、varchar(max)、nvarchar(max)、varbinary(max) 和 xml 都是大型对象数据类型。压缩此数据可以改善磁盘空间使用情况:

  • 重新组织指定的聚集索引将压缩该聚集索引的叶级别(数据行)包含的所有 LOB 列。

  • 重新组织非聚集索引将压缩该索引中属于非键(包含性)列的所有 LOB 列。

  • 如果指定 ALL,将重新组织与指定的表或视图相关联的所有索引,并压缩与聚集索引、基础表或带有包含列的非聚集索引相关联的所有 LOB 列。

  • 如果 LOB 列不存在,则忽略 LOB_COMPACTION 子句。

http://www.cnblogs.com/roucheng/p/3541165.html

重新生成:

重新生成索引将删除该索引并创建一个新索引。此过程中将删除碎片,通过使用指定的或现有的填充因子设置压缩页来回收磁盘空间,并在连续页中对索引行重新排序(根据需要分配新页)。这样可以减少获取所请求数据所需的页读取数,从而提高磁盘性能。

可以使用下列方法重新生成聚集索引和非聚集索引:

  • 带 REBUILD 子句的 ALTER INDEX。此语句将替换 DBCC DBREINDEX 语句。

  • 带 DROP_EXISTING 子句的 CREATE INDEX。

重新组织或重新生成索引

  1. 在“对象资源管理器”中,展开包含您要重新组织索引的表的数据库。

  2. 展开“表”文件夹。

  3. 展开要为其重新组织索引的表。

  4. 展开“索引”文件夹。

  5. 右键单击要重新组织的索引,然后选择“重新组织”。

  6. 在“重新组织索引”对话框中,确认正确的索引位于“要重新组织的索引”网格中,然后单击“确定”。

  7. 选中“压缩大型对象列数据”复选框,以指定也压缩所有包含大型对象 (LOB) 数据的页。

  8. 单击“确定”。

重新组织表中的所有索引

  1. 在“对象资源管理器”中,展开包含您要重新组织索引的表的数据库。

  2. 展开“表”文件夹。

  3. 展开要为其重新组织索引的表。

  4. 右键单击“索引”文件夹,然后选择“全部重新组织”。

  5. 在“重新组织索引”对话框中,确认正确的索引位于“要重新组织的索引”中。 若要从“要重新组织的索引”网格中删除索引,请选择该索引,再按 Delete 键。

  6. 选中“压缩大型对象列数据”复选框,以指定也压缩所有包含大型对象 (LOB) 数据的页。

  7. 单击“确定”。

重新生成索引

    1. 在“对象资源管理器”中,展开包含您要重新组织索引的表的数据库。

    2. 展开“表”文件夹。

    3. 展开要为其重新组织索引的表。

    4. 展开“索引”文件夹。

    5. 右键单击要重新组织的索引,然后选择“重新组织”。

    6. 在“重新生成索引”对话框中,确认正确的索引位于“要重新生成的索引”网格中,然后单击“确定”。

    7. 选中“压缩大型对象列数据”复选框,以指定也压缩所有包含大型对象 (LOB) 数据的页。

    8. 单击“确定”。

推荐:http://www.cnblogs.com/roucheng/p/GUID.html

sql server索引功能资料的更多相关文章

  1. SQL Server 索引维护(1)——系统常见的索引问题

    前言: 在很多系统中,比如本人目前管理的数据库,索引经常被滥用,甚至使用DTA(数据库引擎优化顾问)来成批创建索引(DTA目前个人认为它的真正用处应该是在发现缺失的统计信息,在以前的项目中,用过一次D ...

  2. SQL Server 索引维护:系统常见的索引问题

    在很多系统中,比如本人目前管理的数据库,索引经常被滥用,甚至使用DTA(数据库引擎优化顾问)来成批创建索引(DTA目前个人认为它的真正用处应该是在发现缺失的统计信息,在以前的项目中,用过一次DTA,里 ...

  3. 【译】SQL Server索引进阶第八篇:唯一索引

    原文:[译]SQL Server索引进阶第八篇:唯一索引     索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就 ...

  4. 转: SQL Server索引的维护 - 索引碎片、填充因子

    转:http://www.cnblogs.com/kissdodog/archive/2013/06/14/3135412.html 实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题 ...

  5. SQL Server索引的维护 - 索引碎片、填充因子 <第三篇>

    实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题都和页密度有关,虽然两者的表现形式在本质上有所区别,但是故障排除工具是一样的,因为处理是相同的. 对于非常小的表(比64KB小得多), ...

  6. SQL Server索引进阶:第八级,唯一索引

    原文地址: Stairway to SQL Server Indexes: Level 8,Unique Indexes 本文是SQL Server索引进阶系列(Stairway to SQL Ser ...

  7. SQL Server审计功能入门:CDC(Change Data Capture)

    原文:SQL Server审计功能入门:CDC(Change Data Capture) 介绍 SQL Server 2008引入了CDC(Change Data Capture),它能记录: 1. ...

  8. SQL Server 索引维护(1)——如何获取索引使用情况

    前言: 在前面一文中,已经提到了三类常见的索引问题,那么问题来了,当系统出现这些问题时,该如何应对? 简单而言,需要分析现有系统的行为,然后针对性地对索引进行处理: 对于索引不足的情况:检查缺少索引的 ...

  9. 【译】索引进阶(一):SQL SERVER索引介绍

      [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正]  原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/7 ...

随机推荐

  1. std::bind和std::function

    std::bind 用于绑定一个函数,返回另外一种调用方式的函数对象 ,可以改变参数顺序 和个数,特别是在多线程的程序中,经常用它将函数进行包装,然后打包发送给工作线程,让工作线程去执行我们的任务. ...

  2. wdlinux 一键安装

    Linux系统(支持CentOS 6.X/7.X.RedHat 6.X.Ubuntu 12.04): ssh登录服务器,执行如下操作即可,需root用户身份安装 wget http://dl.wdli ...

  3. android 渐变展示启动屏

    启动界面Splash Screen在应用程序是很常用的,往往在启动界面中显示产品Logo.公司Logo或者开发者信息,如果应用程序启动时间比较长,那么启动界面就是一个很好的东西,可以让用户耐心等待这段 ...

  4. [Compose] 20. Principled type conversions with Natural Transformations

    We learn what a natural transformation is and see the laws it must obey. We will see how a natural t ...

  5. DIV实现纵向滚动条overflow-y

    DIV实现纵向滚动条overflow-y:scroll的使用, 1.首先设置固定div的宽高2.overflow-y:scroll如果设置overflow:auto;表示当你内容超过div高度出现滚动 ...

  6. 如何通过XShell传输文件

    转载孟光孟叔的博客:  https://learndevops.cn/index.php/2016/06/14/how-to-transfer-file-using-xshell xshell目前最好 ...

  7. IIS 日志文件分析

    先安装下文参考资料中的log parser studio 然后就可以针对日志文件进行sql语句的查询了. 各页面访问量排行 ) FROM '[LOGFILEPATH]' where cs-uri-st ...

  8. 解决tomcat启动Socket监听端口死循环被hold问题

    原文链接:http://blog.csdn.net/dead_cicle/article/details/7073433 1.SOCKET监听置于servlet的init方法中,在web.xml里加入 ...

  9. 所有博客已经迁移到个人空间 blog.scjia.cc

    所有博客已经迁移到个人空间 blog.scjia.cc

  10. Linux下动态链接库 与gcc 选项

    -L 编译时查找动态链接库的路径 -lxxx(小写)  e.g -lcudart   = link libcudart.so  , -I(大写) 头文件的路径 -rpath (-R), 编译时指定链接 ...