在 Oracle 中处理表时,您如何知道何时设置了一个好的索引和一个坏的索引?
6 回答
这取决于您所说的“好”和“坏”的含义。基本上,您需要意识到您添加的每个索引都会提高该列的任何搜索的性能(因此向人员表的“姓氏”列添加索引将提高其中包含“其中姓氏=”的查询的性能)但是降低整个表的写入性能。
原因是当您添加或更新一行时,它必须添加或更新表本身以及该行所属的每个索引。因此,如果您在一个表上有五个索引,则每次添加都必须写入六个位置 - 五个索引和表 - 在最坏的情况下,更新可能会触及六个位置。
索引创建是查询速度和写入速度之间的平衡行为。在某些情况下,例如在通宵工作中每周仅加载一次数据但每天查询数千次的数据集市,使用索引过载并尽可能加快查询速度是非常有意义的。然而,在在线交易处理系统的情况下,您想尝试在它们之间找到平衡。
所以简而言之,为选择查询中经常使用的列添加索引,但尽量避免添加太多,因此首先添加最常用的列。
之后是负载测试的问题,以查看性能在生产条件下的反应,并进行大量调整以找到可接受的平衡。
多样化、高度具体或独特的字段可以作为良好的索引。如日期和时间戳、唯一递增数字(通常用作主键)、人名、车牌号等...
一个反例是性别 - 只有两个常见值,因此索引并不能真正帮助减少必须扫描的行数。
全长的描述性自由格式字符串会产生较差的索引,因为执行查询的人很少知道字符串的确切值。
线性排序的数据(例如时间戳或日期)通常用作聚集索引,它强制将行按索引顺序存储,并允许按顺序访问,从而大大加快范围查询(例如'给我所有的销售订单在 10 月和 12 月之间”)。在这种情况下,数据库引擎可以简单地查找范围指定的第一条记录并开始顺序读取,直到它到达最后一条。
@臭名昭著的牛——你必须考虑主键,而不是索引。
@Xenph Yan——其他人没有提到的是选择创建什么样的索引。有些数据库实际上并没有给您太多选择,但有些数据库有多种可能的索引。B 树是默认的,但并不总是最好的索引。选择正确的结构取决于您期望的使用类型。您最需要支持哪种查询?您是处于以读为主还是以写为主的环境中?你的写入是由更新还是附加控制的?等等等等。
此处提供了不同类型索引及其优缺点的说明:http: //20bits.com/2008/05/13/interview-questions-database-indexes/。
这是一篇很棒的 SQL Server 文章: http ://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx
虽然这些机制在 Oracle 上不起作用,但这些技巧非常恰当(减去聚集索引上的东西,它在 Oracle 中的工作方式不太一样)。
如果您正在尝试改进特定查询,请遵循一些经验法则。
对于一个特定的表(你认为 Oracle 应该从哪里开始)尝试索引 WHERE 子句中使用的每个列。首先放置具有相等性的列,然后放置具有范围或类似的列。
例如:
WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200
如果列的大小非常大(例如,您正在存储一些 XML 或其他内容),您最好将它们排除在索引之外。这将使扫描的索引更小,假设您无论如何都必须转到表行以满足选择列表。
或者,如果 SELECT 和 WHERE 子句中的所有值都在索引中,Oracle 将不需要访问表行。因此,有时最好将选定的值放在索引的最后,并避免一起访问表。
你可以写一本关于最好的索引方法的书——找作家乔纳森·刘易斯。
一个好的索引是你可以依赖的东西,它对于特定的表行是唯一的。
一种常用的索引方案是使用对表中的每一行递增 1 的数字。每行最终都会有不同的数字索引。