1

如果我需要查看超过 2000 个表的索引,从 sp_spaceused 命令的信息中我应该从哪里开始?

我正在调查表上的索引,但是当我在 SQL 中执行 sp_spaceused 存储过程时,我不太确定如何处理 IndexSize 的结果。

首先,我可以使用 IndexSize 和 DataSize 之间的比率来判断索引是否最优?例如,如果我的表的 DataSize 为 31 261 768KB,IndexSize 为 41 682 120KB,我将 indexSize/DataSize *100 相除,得到的比率为 133。我做的对吗?如果它是正确的,超过 100% 的 IndexSize-ratio 是不是很糟糕?

那么好的比例是多少呢?

谢谢,

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~需要补充更多信息。

该应用程序是 Microsoft Dynamics Ax 4.0。虽然开发者可以添加新的索引,但是系统索引是不能删除的。

我们目前处于一种情况,即分配了不添加任何值的自定义索引(空白字段上的索引、金额字段上的索引等)。我正在调查这些作为代码清理过程的一部分。

但是因为有成千上万的表需要处理,所以我需要一个起点。我首先关心的是识别不增加价值的自定义索引,为此我考虑使用 sp_spaceused 过程。

4

3 回答 3

1

检查索引大小与数据大小的比率是一个糟糕的指标。

唯一应该驱动索引创建或修改的是性能。这将在很大程度上取决于表中的活动(很多SELECTs,很多INSERTS/UPDATEs,一些组合?)和表的构成。

不幸的是,对此没有简单的答案。索引是数据库设计中最复杂的方面之一。

我建议您对此进行一些阅读。

在这里查看 Kimberly Tripp 的博客。
她在 MS 工作了很长一段时间,她的丈夫 (Paul Randall) 在 SQL Server 2005 中编写了 DBCC 程序。

Gail Shaw 在她的博客中也有一些不错的文章。

于 2011-04-01T12:32:07.780 回答
1

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

希望有帮助。

于 2011-04-04T14:12:52.527 回答
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

于 2011-04-01T12:44:47.843 回答