2012-09-14 91 views
18

我调整我的SQL服务器,当我告诉我的执行计划为我查询一个在顶部有这么一句话:缺少索引详细SQL

“失踪指数(影响99.7782):创建非聚集索引...”

所以我看着缺失索引信息和其显示的:

/* 
Missing Index Details from ExecutionPlan1.sqlplan 
The Query Processor estimates that implementing the following index could improve the query cost by 99.7782%. 
*/ 

/* 
USE [phsprod] 
GO 
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>] 
ON [dbo].[address] ([userid]) 

GO 
*/ 

我只用SQL工作了一个月了,我从来没有做过这种事情为我所有的表都已经为我建成了。任何人都可以帮助解释/给我任何想法如何处理这个?谢谢。

+4

请注意,当修改(添加,删除,更新)表的内容以及磁盘空间中不一定的小成本时,索引会减少在维护(系统)时以小的时间成本处理查询的时间,加上在需要考虑更多索引时分析查询计划所花费的额外时间通常无法估量。总体而言,指数表现良好;太多索引可能是一个问题。在添加它们时使用谨慎。 –

回答

22

这意味着SQL Server建议您的查询使用索引运行得更快。索引添加开销和磁盘存储,所以您应该忽略此提示,除非查询在生产中给出性能问题。

创建索引,use后取消注释语句,用真实姓名替换[<Name of Missing Index, sysname,>],并运行它:

USE [phsprod] 
GO 
CREATE NONCLUSTERED INDEX IX_Address_UserId 
ON [dbo].[address] ([userid]) 
+3

+1,尽管我会说这个指数建议应该与一粒盐一起服用。它们应由集中管理模式的人员应用,并理解*所有*查询不仅仅是这一个。 – usr

14

这意味着SQL Server正在暗示你的查询可以运行这个索引快。

这可能意味着您当前的索引不是查询所运行的最大值。也许你的查询可以被优化。或者,也许你可以添加索引。但是,如果你决定这样做,你必须仔细分析。

实际上,索引会增加开销和磁盘存储空间。但是,它也可以提高性能。例如,如果您总是基于“userid”在表中搜索,那么可能会在该列上添加索引,因为SQL将能够搜索此索引。

如果你在一个词典中搜索一个词,可以考虑一下这个。 如果您在寻找单词“dog”,您将搜索“d”,然后搜索以“do”开头的单词,最终找到单词“dog”。

如果在词典中这些词不是按字母顺序排列的,则必须搜索整个词典才能找到“dog”这个词!

聚集索引(或主键)是列的顺序。 现在,似乎你没有在“userid”列上的索引。所以SQL Server有(可能)扫描整个表,直到找到用户标识。

如果添加非聚簇索引,它不会重新排序表,但它会告诉SQL Server在哪些范围内搜索以找到要使用的用户标识。 (比如“在20到30之间的词典中”)因此它不需要搜索整个表来找到它。

但这也意味着,当您向表中添加新数据或删除或修改时,他需要保持其索引保持最新。一般来说,少数指标不会受到伤害,但您需要确保它们是必需的。你不想添加太多的索引,因为如果你添加太多,他们会伤害到性能。

如果你的表只包含几百行,也许它不会显示你的性能有很大的改进。但随着时间的推移,当桌子增长时,它可能会有所作为。

希望有帮助!

+1

在我的工作中,我们有非常旧的数据库,实际上没有索引。在我们的数据库中添加索引(可能有100个或更多,有数百个表,有时超过100万行)真的有助于提高性能。 –

+0

我现在在该特定表中有近83,000行。 –

+3

您应该尝试运行一些带有或不带有新索引的查询来查看性能差异。您还可以显示执行计划,以查看新索引是否更好。而且,您还应该检查应用程序在该表上执行的其他查询。验证它确实可以改善其他查询,或者至少可以改善其他查询的性能。 –