【发布时间】:2011-12-06 08:10:02
【问题描述】:
我不是 db 家伙。但我需要创建表并对它们进行 CRUD 操作。如果我默认在所有列上创建索引,我会感到困惑 或不?这是我在创建索引时考虑的理解。
索引基本上包含内存位置范围(存储第一个值的起始内存位置到最后一个值的结束内存位置 存储)。因此,当我们在表索引中插入任何值时,列需要更新,因为它还有一个值,但列的更新 value 不会对索引值产生任何影响。 对吗? 所以底线是当我的列用于连接两个表时,我们应该考虑 在连接中使用的列上创建索引,但可以跳过所有其他列,因为如果我们在它们上创建索引,它将涉及额外的成本 在列中插入新值时更新索引值。对吗?
考虑这种情况,其中表mytable 包含两个三列,即col1、col2、col3。现在我们触发这个查询
select col1,col2 from mytable
现在这里有两种情况。在第一种情况下,我们在col1 和col2 上创建索引。在第二种情况下,我们不创建任何索引。**根据我的理解
case 1 会比 case2 快,因为在 case 1 中,我们 oracle 可以快速找到列内存位置。所以在这里我没有使用任何连接列但是
仍然索引在这里有所帮助。那么我是否应该考虑在这里创建索引?**
如果我们在上述相同的情况下开火会怎样?
select * from mytable
而不是
select col1,col2 from mytable
索引在这里有用吗?
【问题讨论】:
-
索引对 SELECT 子句中的值没有任何作用。重要的是您的 ON 子句或 WHERE 子句中的字段列表。
-
@Bill - Oracle 是否尽可能使用覆盖索引?我是一名 SQL Server 人员,我知道 Oracle 处理索引的方式略有不同,但我认为在某些情况下它仍然使用覆盖索引。
-
@Tom:嗯。每天学些新东西。我也是一个 MSSQL 人,不知道这一点。尽管如此,覆盖索引似乎只有在你做很多 R 而不是很多 CUD 时才有用。
-
@Bill - 是的。就像数据库世界中的许多事情一样,这都是一种平衡行为。最终的平衡取决于应用程序的具体情况。