如果我需要查看超过2000个表的索引,我从哪里开始给出sp_spaceused命令中的信息?
我正在调查表上的索引,但是当我在SQL中执行sp_spaceused存储过程时,我不太确定如何为IndexSize提供结果。
首先,我可以使用IndexSize和DataSize之间的比率来调用索引是否最佳?例如,如果我的表的DataSize是31 261 768KB而IndexSize是41 682 120KB,我将indexSize / DataSize * 100除以得到133的比率。我正在做的是什么? 如果它是正确的,IndexSize比率是否超过100%?
那么一个好的比例会是什么?
谢谢,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 我需要添加更多信息。
该应用程序是Microsoft Dynamics Ax 4.0。虽然开发人员可以添加新索引,但系统索引无法删除。
我们目前处于这样一种情况,即有许多自定义索引不会添加任何值(空白字段上的索引,金额字段上的索引等)。我正在调查那些作为代码清理过程的一部分。
但是因为有数千个表需要解决,所以我需要一个起点。我首先要关注的是识别不会增加价值的自定义索引,为此我想到了使用sp_spaceused过程。
答案 0 :(得分:1)
检查索引大小与数据大小的比率是一个可怕的指标。
唯一应该推动索引创建或修改的是性能。这在很大程度上取决于表格中的活动(很多SELECT
,很多INSERTS/UPDATEs
,某些组合?)和表格的构成。
不幸的是,对此没有简单的答案。索引是数据库设计中最复杂的方面之一。
我建议你做一些阅读。
Check out Kimberly Tripp's blog here.
她在MS工作了很长一段时间,她的丈夫(Paul Randall)在SQL Server 2005中编写了DBCC程序。
答案 1 :(得分:1)
Performance Analyzer for Microsoft Dynamics可用于分析AX DB中昂贵且长时间运行的查询,丢失的聚簇索引,错误和缺失的索引,隐藏的聚簇索引扫描等。
消除不必要索引数量的一种方法是在同一个表上搜索作为另一个索引的左键子集的索引。除非子集密钥是唯一的,否则其有用性包含在超集密钥中。要获取此类索引的列表,您可以运行以下查询:
SELECT *
FROM INDEX_STATS_CURR_VW O
WHERE INDEX_DESCRIPTION NOT LIKE '%UNIQUE%'
AND EXISTS
(
SELECT * FROM INDEX_STATS_VW I
WHERE I.RUN_NAME = O.RUN_NAME
AND I.TABLE_NAME = O.TABLE_NAME
AND I.INDEX_KEYS <> O.INDEX_KEYS
AND I.INDEX_KEYS LIKE O.INDEX_KEYS + ',%'
AND O.USER_SEEKS = 0
)
ORDER BY TABLE_NAME, INDEX_KEYS
要概述在整个监视期间未使用的所有索引,您可以运行以下查询:
SELECT TABLE_NAME,
INDEX_NAME,
INDEX_DESCRIPTION,
INDEX_KEYS,
INCLUDED_COLUMNS,
SUM(USER_SEEKS) AS USER_SEEKS,
SUM(USER_SCANS) AS USER_SCANS,
SUM(USER_LOOKUPS) AS USER_LOOKUPS,
SUM(USER_UPDATES) AS USER_UPDATES
FROM INDEX_STATS_VW
WHERE INDEX_DESCRIPTION NOT LIKE '%UNIQUE%'
GROUP BY TABLE_NAME, INDEX_NAME, INDEX_DESCRIPTION, INDEX_KEYS, INCLUDED_COLUMNS
HAVING SUM(USER_SEEKS) = 0
AND SUM(USER_SCANS) = 0
AND SUM(USER_LOOKUPS) = 0
ORDER BY 9 DESC
您还可以识别使用索引搜索过滤数据的查询:
SELECT TOP 100 * FROM HIDDEN_SCANS_CURR_VW
ORDER BY TOTAL_ELAPSED_TIME DESC
以下内容将显示从SQL Server DMV角度按平均逻辑读取排序的10个最昂贵的查询:
SELECT TOP 10
SQL_TEXT,
QUERY_PLAN,
TOTAL_ELAPSED_TIME,
AVG_ELAPSED_TIME,
MAX_ELAPSED_TIME,
AVG_LOGICAL_READS,
EXECUTION_COUNT
FROM QUERY_STATS_CURR_VW
ORDER BY AVG_LOGICAL_READS DESC
您还需要查看其他参数,例如执行计数(执行查询的次数)。
如果您想概述运行时间超过1000毫秒的AX查询,可以运行以下查询:
SELECT CONVERT(nvarchar,CREATED_DATETIME,101) AS CREATED_DATE,
DATEPART (hh, CREATED_DATETIME) AS HOUR_OF_DAY,
COUNT (CREATED_DATETIME) AS EXECUTION_COUNT,
SUM (SQL_DURATION) AS TOTAL_DURATION,
AVG (SQL_DURATION) AS AVERAGE_DURATION
FROM AX_SQLTRACE_VW
WHERE SQL_DURATION > 1000 and CREATED_DATETIME > '04/01/2011'
GROUP BY CONVERT(nvarchar, CREATED_DATETIME, 101), DATEPART (hh, CREATED_DATETIME)
ORDER BY CREATED_DATE, HOUR_OF_DAY
希望有所帮助。
答案 2 :(得分:0)
我不确定你想要实现的目标。您将优化查询,而不是索引。但是太多的索引会阻碍写入性能。我建议您查看2005年提供的DMV(动态管理视图)。
例如select * from sys.dm_index_usage_stats
将帮助识别未使用的索引。
有一个与BOL上的索引相关的DMV列表。
http://msdn.microsoft.com/en-us/library/ms187974%28v=SQL.90%29.aspx