我不是分贝的家伙。但是我需要创建表并对它们执行CRUD操作。我很困惑是否应该默认在所有列上创建索引?这是我在创建索引时考虑的理解。
索引基本上包含存储位置范围(存储第一个值的起始存储位置到存储最后一个值的结束存储位置)。因此,当我们在表索引中插入任何值时,列的值需要更新,因为它又有一个值,但是列值的更新不会对索引值产生任何影响。 正确的? 因此,最重要的是,当我的列用于两个表之间的联接时,我们应考虑在联接中使用的列上创建索引,但是可以跳过所有其他列,因为如果我们在它们上创建索引,则在新值时更新索引值将涉及额外的成本被插入列中。 正确的?
考虑这种情况,其中表格mytable包含两个三列,即col1,col2,col3。现在我们触发这个查询
mytable
col1
col2
col3
select col1,col2 from mytable
现在这里有两种情况。在第一种情况下,我们在col1和上创建索引col2。在第二种情况下,我们不创建任何索引。根据我的理解,情况1将比情况2快,因为在情况1中,oracle可以快速找到列内存位置。所以在这里我没有使用任何联接列,但索引仍然在这里有所帮助。所以我应该考虑在这里创建索引吗?
如果我们在上述相同情况下解雇怎么办
select * from mytable
代替
索引对您有帮助吗?
但是列值的更新不会对索引值产生任何影响。正确的?
否。更新索引列会产生影响。Oracle 11g性能手册指出:
修改索引列的UPDATE语句以及修改索引表的INSERT和DELETE语句所花费的时间比没有索引时要长。此类SQL语句必须修改索引中的数据和表中的数据。它们还会创建其他撤消和重做。
因此,最重要的是,当我的列用于两个表之间的联接时,我们应考虑在联接中使用的列上创建索引,但是可以跳过所有其他列,因为如果我们在它们上创建索引,则在新值时更新索引值将涉及额外的成本被插入列中。正确的?
不仅是插入,还包括任何其他数据处理语言语句。
考虑这种情况。。。索引对您有帮助吗?
关于最后一段,为什么不使用代表性的数据量构建一些测试用例,以便证明或反对关于应该索引哪些列的假设?