我刚刚听说您应该在要加入或查询的任何列上创建索引。如果标准如此简单,为什么数据库不能自动创建他们需要的索引?
答案 0 :(得分:2)
嗯,他们这样做;在某种程度上至少......
例如,请参阅SQL Server Database Engine Tuning Advisor。
但是,创建最佳索引并不像您提到的那么简单。一个更简单的规则可能是在每个列上创建索引(这远非最优)!
索引不是免费的。您可以以存储为代价创建索引,并更新性能等。应该认真考虑它们是最佳的。
答案 1 :(得分:2)
您添加的每个索引都可以提高查询速度。它将降低更新,插入和删除的速度,将增加磁盘空间使用量。
首先,我宁愿保持控制权,使用DB Visualizer等工具和解释语句来提供评估应该做什么所需的信息。我不希望DBMS单方面决定什么是最好的。
在我看来,一个真正聪明的实体正在做出数据库调整决策。 DBMS可以提出它想要的所有内容,但最终的决定应该留给DBA。
当数据库使用模式改变一周时会发生什么?你真的希望DBMS创建索引并在一周后销毁它们吗?这听起来就像天网一样的管理噩梦: - )
答案 2 :(得分:1)
这是一个很好的问题。数据库可以根据数据使用模式创建所需的索引,但这意味着数据库在第一次执行某些查询时会很慢,然后随着时间的推移变得越来越快。例如,如果有这样的表:
ID USERNAME -- --------
:然后用户名将用于经常查找用户。经过一段时间后,数据库可以看到50%的查询说这样做,在这种情况下,它可以在用户名上添加索引。
然而,没有详细实施的原因仅仅是因为它不是一个杀手级的功能。 DBA执行添加索引的次数相对较少,并且通过自动化(这是一项非常大的任务)可能对数据库供应商来说不值得。请记住,必须分析每个查询以启用自动索引,以及查询响应时间和结果集大小,因此实现它是非常重要的。
答案 3 :(得分:0)
因为数据库只是存储和检索数据 - 数据库引擎不知道你打算如何检索数据,直到你真正这样做,在这种情况下,创建索引为时已晚。您加入的列可能不适合有效的索引。
答案 4 :(得分:0)
RDBMS可以轻松地自我调整并创建索引,但这只适用于查询没有严格执行计划的简单案例。创建大多数索引是为了针对特定目的进行优化,并且可以更好地手动处理这些类型的优化。
答案 5 :(得分:0)
这是一个需要解决的非常重要的问题,在许多情况下,次优的自动解决方案可能会使事情变得更糟。想象一下,一个数据库的读取操作是通过自动索引创建来加速的,但由于管理索引的开销导致其插入和更新被剔除了?这种好坏取决于数据库的性质和它所服务的应用程序。
如果有一个通用的解决方案,那么数据库肯定会这样做(并且有一些工具可以建议这种优化)。但调整数据库性能主要是特定于应用程序的功能,最好是手动完成,至少目前是这样。