在使用Oracle中的表时,您如何知道何时设置好索引而不是错误索引?
答案 0 :(得分:20)
这取决于你对“好”和“坏”的意思。基本上你需要意识到你添加的每个索引都会提高该列搜索的性能(因此在person表的'lastname'列中添加索引会提高在其中包含“where lastname =”的查询的性能)但是降低整个表格的写入性能。
原因是当您添加或更新行时,它必须添加或更新表本身以及该行所属的每个索引。因此,如果表上有五个索引,则每个添加必须写入六个位置 - 五个索引和表 - 并且在最坏的情况下更新可能会触及六个位置。
索引创建是一种平衡行为,然后在查询速度和写入速度之间。在某些情况下,例如一个数据集市只能在一夜之间在一夜间工作中加载数据但每天查询数千次,因此使用索引重载并尽可能加快查询速度非常有意义。但是,对于在线交易处理系统,您希望尝试在它们之间找到平衡点。
简而言之,将索引添加到在select查询中经常使用的列,但尝试避免添加太多,因此首先添加最常用的列。
之后进行负载测试以了解性能如何在生产条件下做出反应,并进行大量调整以找到可保证的平衡。
答案 1 :(得分:6)
具有多样性,高度特异性或唯一性的字段可构建良好的索引。例如日期和时间戳,唯一递增数字(通常用作主键),人名,车牌号等......
反例是性别 - 只有两个共同的值,因此索引并没有真正帮助减少必须扫描的行数。
全长描述性自由格式字符串会生成不良索引,因为执行查询的人很少知道字符串的确切值。
线性排序的数据(例如时间戳或日期)通常用作聚簇索引,它强制按行索引顺序存储行,并允许按顺序访问,大大加快了范围查询(例如'给我所有10月到12月之间的销售订单')。在这种情况下,数据库引擎可以简单地搜索范围指定的第一个记录,并开始按顺序读取,直到它到达最后一个记录。
答案 2 :(得分:2)
这是一篇很棒的SQL Server文章: http://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx
虽然这些机制不适用于Oracle,但提示非常合适(减去聚簇索引上的东西,这在Oracle中的工作方式不同)。
答案 3 :(得分:2)
@Infamous Cow - 你必须考虑主键,而不是索引。
@Xenph Yan - 其他人没有涉及的是选择要创建的种索引。有些数据库并没有给你太多选择,但有些数据库有很多种可能的索引。 B树是默认,但并不总是最好的索引。选择正确的结构取决于您期望的使用类型。您最需要支持哪些类型的查询?您是在阅读主要或写作主要环境?你的写作是由更新或附加主导吗?等等。
此处提供了不同类型索引及其优缺点的说明:http://20bits.com/2008/05/13/interview-questions-database-indexes/。
答案 4 :(得分:0)
如果您尝试改进特定查询,请遵循一些经验法则。
对于特定的表(您认为Oracle应该从哪里开始)尝试索引WHERE子句中使用的每个列。首先放置具有相等性的列,然后是带有范围等的列。
例如:
WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200
如果列的大小非常大(例如,您正在存储某些XML或其他内容),最好将它们从索引中删除。这将使索引更小以进行扫描,假设您必须转到表行以满足选择列表。
或者,如果SELECT和WHERE子句中的所有值都在索引中,Oracle将不需要访问表行。因此,有时最好将所选值放在索引的最后,并避免一起访问表。
你可以写一本关于索引的最佳方法的书 - 寻找作者Jonathan Lewis。
答案 5 :(得分:-2)
一个好的索引可以依赖于特定表行的唯一索引。
一种常用的索引方案是使用表格中每行递增1的数字。每一行最终都会有不同的数字索引。