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