向SQL Server添加索引是一个坏主意吗?

时间:2010-05-21 01:12:42

标签: sql-server indexing

我们有一个基于SQL Server的中型应用程序没有定义索引。甚至没有在标识列上。我建议我们中等昂贵的应用程序顾问,或许我们可以通过在适当的字段上创建一些索引来获得更好的性能(特别是当我们的数据库增长时),并且他说:

“索引将显着影响应用程序的其他区域,客户不应在任何情况下创建它们。”

有人听说过这样的事吗?有没有人应该不创建任何索引?我可以看到这个应用程序没什么特别的 - 它有int标识列,然后是很多字符串列,一堆关系表,但没有什么特别的或奇怪的,我可以看到。

谢谢!

[编辑:标识栏没有使用“标识规范”,它们似乎是由程序设置的,用Management Studio查看数据库,我可以找到 NO 索引...]

关注:在一次会议上,我向生产此产品的公司的首席执行官(和首席架构师)询问了这个问题,他的回答是他们认为对于中小型部署而言,与维护索引相关的开销会带来更大的负面影响。总体用户体验(应用程序执行大量写入)比索引的优势会抵消,但对于大型数据库,它们确实创建了索引。这位技术支持人员过于热心,对他的回答毫无帮助。神秘解决了。

7 个答案:

答案 0 :(得分:3)

你有备用的磁盘空间吗?我见过索引比表更重的情况。

然而,无论如何都没有索引!除非所有读取操作都需要整个表格,否则不可能出现这种情况。

答案 1 :(得分:3)

存在过度索引这样的问题,尤其是在具有非常大的表的INSERT和UPDATE繁重应用程序中。因此,标题中问题的答案是肯定的,添加索引有时是个坏主意。

这与您在问题正文中提出的问题完全不同,即“在SQL Server数据库中没有索引是否正常”。答案是,除非您将数据库用作“只写”系统,在该系统中添加数据但仅在批量提取并转换为另一个数据存储后进行读取,因此不要在数据库中使用某些索引。数据库中。

您的顾问的声明很奇怪,让我相信您可能已经从您的描述中留下了一些重要信息。如果没有,我会说他很疯狂。

答案 2 :(得分:3)

雇用我,我会为你创建索引。 14年的Sybase / SQL Server经验告诉我创建这些!darn!索引。除非你的表每个记录少于500个。

我的想法是索引散列节点的大小大致为1000。

您需要注意的另一件事是您的顾问是否已将表格标准化。也许,该表有500个字段/列,包含多个概念实体或十几个概念实体。这可能就是他为创建索引而感到紧张的原因,因为如果表中有12个概念实体,那么至少会有12组索引 - 在这种情况下,他绝对是正确的 - 在任何情况下都不会......等等等等。

然而,如果他确实每桌有500列或可检测的多个概念实体 - 他是一个非常糟糕的数据设计工程师。在我与更有经验的数据工程师合作的这些年里,我们的表很少超过20列。 5偏低,平均10。有时为了表现,我们允许在表中混合两个实体,或者将行出现水平化为表的列。

当您查看表格设计时,您可以使用未经训练的眼睛看到Product,Project,BuildSheet,FloorPlan,Equipment等记录全部滚动到一个长行中。您不能将所有这些实体混合在一起。

这是我知道为什么他可以建议你不要索引的唯一原因。如果他这样做,你应该知道他是欺骗性地向你的公司代表他的数据设计技巧,你应该立即将他从你的每周合同费用中扣除。

好的,读完拉里的帖子后 - 我也同意他的意见。

答案 3 :(得分:2)

具有键约束的列无论如何都会有一个隐式索引。因此,如果您总是通过主键进行选择,那么添加更多索引就没有意义了。如果您按其他条件选择,则在您要查询的列上添加索引是有意义的。

它还取决于数据插入量的大小。如果您插入的频率高于查询频率,那么保持索引更新的开销会使插入速度变慢。

但是说你“不应该在任何情况下创建[索引]”有点多。

我建议您使用SQL Server Profiler工具运行一些查询。此工具将建议添加哪些索引对性能影响最大。

答案 4 :(得分:1)

在大多数普通应用程序中,索引对插入性能的影响有点无问题。您通常最好创建索引,如果插入性能急剧下降(可能不会),您可以尝试其他方法。显然有一些例外,你应该更加小心,例如用于记录的表。

如上所述,磁盘空间可能是一个问题。

创建不相关的索引(例如重复索引)也会浪费微秒,偶尔会导致错误的查询执行计划。

我看到的另一个问题是奇怪的代码第三方应用程序在运行时生成部分数据库,并且可以删除或阻塞他们不知道的索引。

在绝大多数情况下,精心挑选的指数只会带来好处。

答案 5 :(得分:0)

没有id列上的索引听起来真的很不寻常,我会发现任何理由不包括它们闻起来很腥。

您应该知道,如果您对数据库进行大量提交,添加更多索引会影响插入速度,但是没有id的索引?哇。

如果能够更好地证明添加额外索引可能会导致问题,那将是一件好事。

答案 6 :(得分:0)

您拥有的索引越多,数据插入和修改就越慢。确保在适当时添加索引并编写可以利用这些索引的查询,如果索引的选择性水平低,则无法有效使用