在Oracle中使用表时,您如何知道何时设置好索引而不是坏索引?

===============>>#1 票数:21 已采纳

这取决于你的“好”和“坏”的含义。 基本上你需要意识到你添加的每个索引都会提高该列搜索的性能(因此在person表的'lastname'列中添加索引会提高在其中包含“where lastname =”的查询的性能)但是降低整个表的写入性能。

原因是当您添加或更新行时,它必须添加或更新表本身以及该行所属的每个索引。 因此,如果表上有五个索引,则每个添加必须写入六个位置 - 五个索引和表 - 并且在最坏的情况下更新可能会触及六个位置。

索引创建是一种平衡行为,然后在查询速度和写入速度之间。 在某些情况下,例如一个数据集市只能在一夜之间在一夜间工作中加载数据但每天查询数千次,因此使用索引重载并尽可能加快查询速度非常有意义。 但是,对于在线交易处理系统,您希望尝试在它们之间找到平衡点。

简而言之,将索引添加到在select查询中经常使用的列,但尽量避免添加太多,因此首先添加最常用的列。

在那之后进行负载测试,看看性能如何在生产条件下做出反应,并进行大量调整以找到可保证的平衡。

===============>>#2 票数:7

多样化,高度特异性或独特的字段构成良好的索引。 例如日期和时间戳,唯一递增数字(通常用作主键),人名,车牌号等......

反例就是性别 - 只有两个共同的值,因此索引实际上并没有帮助减少必须扫描的行数。

全长描述性自由格式字符串会生成较差的索引,因为执行查询的人很少知道字符串的确切值。

线性排序的数据(例如时间戳或日期)通常用作聚簇索引,它强制按行索引顺序存储行,并允许按顺序访问,大大加快了范围查询(例如'给我所有的销售订单十月到十二月之间')。 在这种情况下,DB引擎可以简单地寻找由该范围指定的第一个记录并开始顺序读取,直到它到达最后一个。

===============>>#3 票数:3

@Infamous Cow - 你必须考虑主键,而不是索引。

@Xenph Yan - 其他人没有涉及的是选择创建什么的索引。 有些数据库并没有给你太多选择,但有些数据库有很多种可能的索引。 B树是默认的,但并不总是最好的索引。 选择正确的结构取决于您期望的使用类型。 您最需要支持哪些类型的查询? 您是在阅读主要或写作主要环境? 你的写作是由更新或附加主导吗? 等等

有关不同类型索引及其优缺点的说明,请访问: http//20bits.com/2008/05/13/interview-questions-database-indexes/

===============>>#4 票数:2

这是一篇很棒的SQL Server文章: http//www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx

虽然这些机制不适用于Oracle,但提示非常合适(减去聚簇索引上的东西,这在Oracle中的工作方式不同)。

===============>>#5 票数:0

如果您尝试改进特定查询,请遵循一些经验法则。

对于特定的表(您认为Oracle应该从哪里开始),请尝试索引WHERE子句中使用的每个列。 首先放置具有相等性的列,然后是具有范围等的列。

例如:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200

如果列的大小非常大(例如,您正在存储某些XML或其他内容),那么最好将它们从索引中删除。 这将使索引更小以进行扫描,假设您必须转到表行以满足选择列表。

或者,如果SELECT和WHERE子句中的所有值都在索引中,Oracle将不需要访问表行。 因此,有时最好将所选值放在索引的最后,并避免一起访问表。

你可以写一本关于最佳索引方法的书 - 寻找作者Jonathan Lewis。

===============>>#6 票数:-2

一个好的索引是您可以依赖的特定表行的唯一索引。

一种常用的索引方案是使用数字,对于表中的每一行递增1。 每一行最终都会有不同的数字索引。

  ask by translate from so

未解决问题?本站智能推荐:

6回复

数据库案例不敏感指数?

我有一个查询,我在搜索字符串: 现在,这工作正常,但它不能很好地扩展,我需要优化它。 我找到了一个创建生成视图的选项 ,或类似的东西,但我希望使用索引的更简单的解决方案。 我们正在使用DB2,我真的想在索引中使用表达式 ,但是这个选项似乎只能在z / OS上使用,但我们运行的是L
2回复

如何知道创建索引需要占用表空间多少空间

我必须在oracle数据库的特定表空间上创建索引。 我想知道是否有一种方法可以告诉表空间创建索引需要多少空间,因此可以确保我的表空间能够处理这样的索引。
2回复

聚集指数

SQL Server中的Insert / Update / Delete语句应使用哪种类型的索引(clustered / nonclustrered)。 我知道它会产生额外的开销,但与非聚集索引相比,它的性能是否更好? 另外哪个索引应该用于SQL Server中的Select语句?
4回复

什么是涵盖指数?

我刚刚在一些数据库讨论中听到了术语“涵盖索引”-这是什么意思?
1回复

我应该制定什么指数?

我创建了一个表data_test,其中包含两个字段issue_date,calling_number我为此表添加了分区。 每天的PARTITION BY RANGE(“ ISSUE_DATE”)流量。 并在calling_number上创建了本地索引。 为了使用以下查询,我应该建立哪个索引
5回复

为什么Oracle会忽略“完美”指数?

我有这张桌子: 而这个指数: 当我运行此查询时 EXPLAIN PLAN显示它进行全表扫描。 所以我放弃了索引并再次创建它。 EXPLAIN PLAN仍然表示全表扫描。 怎么可能? 一些背景:这是历史数据,所以会发生的事情是我查找状态为CLEARED的行并插入
3回复

Oracle综合指数Performace

我的示例oracle查询结构是这样的: 该表有超过一百万条记录。 我已经分别索引了COLUMN_01,COLUMN_02和COLUMN_03。 上面的查询工作正常,并提供预期的结果。 如果在不更改现有索引的情况下将COLUMN_01,COLUMN_02和COLUMN_03( W
2回复

访问:指数名称

我有一个Microsoft Access数据库,需要执行以下语句: ** DROP INDEX名称在安装中 但是,Microsoft Access表示找不到这样的索引名 。 “安装”表中的“名称”列确实具有索引。 我从Access GUI知道这一点。 但是,我无法使用ACCES
1回复

指数如何应对MVCC?

问候Overflowers, 根据我的理解(我希望我不对),对指数的更改不能成为MVCC。 我想知道这是否也适用于大记录,因为副本可能代价高昂。 由于记录是通过索引(通常)访问的,MVCC如何有效? 例如,索引是否跟踪不同版本的MVCCed记录? 最近有
2回复

IOT和普通指数有什么区别?

请帮助我获得IOT和普通索引之间的差异