2011-10-12 89 views
24

我不是db家伙。但我需要创建表格并对它们执行CRUD操作。如果我在默认情况下在所有列上创建索引 ,我是否会感到困惑?这是我在创建索引时考虑的理解。决定何时在数据库的表列创建索引?

索引基本上包含内存位置范围(第一个值存储到结束内存位置的起始内存位置,最后一个值为 )。所以当我们在表索引中插入任何值时,需要更新列,因为它有更多值,但更新列 值不会对索引值产生任何影响。 对不对?因此,底线是当我的列用于两个表之间的连接时,我们应该考虑 在连接中使用的列上创建索引,但所有其他列可以跳过,因为如果我们在它们上创建索引,则会涉及额外成本 更新索引值在列中插入新值时。 对不对?

考虑这种情况,其中表mytable包含两列三列,即col1col2,col3。现在我们启动此查询

select col1,col2 from mytable 

现在有两种情况。在第一种情况下,我们在col1col2上创建索引。在第二种情况下,我们不创建任何索引**根据我的理解, 情况1将比情况2更快,因为在情况1中,oracle可以快速找到列存储器位置。所以在这里我没有使用任何连接列,但 仍然索引在这里帮助。所以,我应该考虑在这里或不创建索引?**

如果在相同的情况下上述,如果我们火

select * from mytable 

代替

select col1,col2 from mytable 

将索引帮助这里是什么?

+8

索引对SELECT子句中的值不做任何操作。重要的是ON子句或WHERE子句中的字段列表。 – Bill

+0

@ Bill - Oracle是否可以使用覆盖索引?我是一个SQL Server的人,我知道Oracle处理索引有点不同,但我认为在某些情况下它仍然使用覆盖索引。 –

+0

@Tom:呵呵。每天学些新东西。我也是一个MSSQL的家伙,并不知道这一点。尽管如此,覆盖索引似乎只有在你处理大量R而不是CUD时才有用。 – Bill

回答

12

但更新列值不会对索引值产生任何影响。对?

否。更新索引列会产生影响。该的Oracle 11g performance manual指出:

该修改索引列和插入和删除 语句修改索引的表需要比如果有 没有索引不再

UPDATE语句。这些SQL语句必须修改 表中的索引和数据中的数据。他们还创建了额外的撤消和重做。


那么底线是在我的专栏是用来在两个表之间的连接,我们应该考虑建立用于连接的列索引,而是因为如果我们在其上创建索引的所有其他列可以忽略它将涉及在列中插入新值时更新索引值的额外成本。对?

不只是插入,而是任何其他数据操作语言语句。

请考虑这种情况。 。 。索引会在这里帮助吗?

关于这最后一段,为什么不建立一些具有代表性数据量的测试用例,以便证明或反驳关于应该索引哪些列的假设?

25

不要在每一列中创建索引!它会降低插入/删除/更新操作的速度。

作为一个简单的提醒,您可以在WHEREORDER BYGROUP BY子句中通用的列中创建索引。您可以考虑在用于涉及其他表colums添加索引(通过JOIN,例如)

例子:

SELECT col1,col2,col3 FROM my_table WHERE col2=1 

这里,创建于col2上的索引,将有助于这个查询了很多。

另外,考虑指数选择性。简单地说,创建具有“大领域”的值的索引,即ID,名称等。不要在男性/女性专栏上创建它们。

1

我希望甲骨文可直接得到单排的所有领域,而不需要额外的指标(这确实不是为此而设计)。

此外,索引会占用大量的磁盘空间和内存以及cpu使用量。

感谢这篇文章,我了解了涵盖索引(酷!),但从我的理解,它允许快速获得其他字段一旦通过索引找到该行。这并不意味着你已经把索引放在所有列上了!只是在PK上,或者你在其中创造条件的领域。

我在这最后一点吗?

(如果你火了SELECT *,因为对我来说这是完全一样的,数据的,将经过网络的量是安全的。)

2

在你给特定的情况下,有没有WHERE子句,因此将使用表扫描或使用索引扫描,但只删除一列,所以性能可能没有那么大。在第二种情况下,不应该使用索引,因为它没有覆盖,也没有WHERE子句。如果存在WHERE子句,则索引可以允许筛选减少需要查找以获取缺失列的行数。

Oracle有许多不同的表,包括堆或索引组织的表。

如果索引覆盖,则更有可能被使用,特别是在选择性时。但是请注意,当WHERE子句中存在约束且覆盖索引中的列数少于基表中的索引时,组织好的表并不比堆中的覆盖索引更好。

创建比实际使用的列多的索引仅有助于更有可能使索引覆盖,但添加所有列与索引组织表类似。请注意,Oracle没有等同于SQL Server的INCLUDE(COLUMN),它可用于使索引更加覆盖(它实际上仅为列的一个子集创建了额外的聚集索引 - 如果您希望某个索引是唯一的,还添加了一些你不希望被认为是唯一性的数据,但有助于使它涵盖更多的查询)

你需要看看你的计划,然后确定索引是否会有所帮助。然后看看计划,看看他们是否有所作为。

相关问题