M S*_*ach 32 sql oracle indexing
我不是db guy.但我需要创建表并对它们执行CRUD操作.如果我默认在所有列上创建索引,我会感到困惑吗?这是我在创建索引时考虑的理解.
索引基本上包含内存位置范围(第一个值存储的起始内存位置到存储最后一个值的最终内存位置).因此,当我们在表索引中插入任何值时,需要更新列,因为它还有一个值,但列值的更新不会对索引值产生任何影响.对?所以底线是当我的列用于两个表之间的连接时,我们应该考虑在连接中使用的列上创建索引,但是可以跳过所有其他列,因为如果我们在它们上创建索引,则会在新值时涉及更新索引值的额外成本插入列中.对?
考虑这种情况,其中表格mytable包含两个三列,即col1,col2,col3.现在我们解雇这个查询
select col1,col2 from mytable
Run Code Online (Sandbox Code Playgroud)
现在这里有两种情况.在第一种情况下,我们在col1和上创建索引col2.在第二种情况下,我们不创建任何索引.**根据我的理解案例1将比case2快,因为在案例1中我们oracle可以快速找到列内存位置.所以这里我没有使用任何连接列,但仍然索引在这里帮助.那么我应该考虑在这里创建索引吗?**
如果在上面的相同场景中,如果我们开火了怎么办
select * from mytable
Run Code Online (Sandbox Code Playgroud)
代替
select col1,col2 from mytable
Run Code Online (Sandbox Code Playgroud)
索引会在这里帮忙吗?
san*_*lto 33
不要在每一列中创建索引!它会减慢插入/删除/更新操作的速度.
作为一个简单的提示,你可以创建,在常见列的索引WHERE,ORDER BY和GROUP BY条款.您可以考虑在用于关联其他表的列中添加索引(JOIN例如,通过a )
例:
SELECT col1,col2,col3 FROM my_table WHERE col2=1
Run Code Online (Sandbox Code Playgroud)
在这里,在col2上创建索引将有助于此查询.
另外,考虑索引选择性.简单地说,在具有"大域"的值上创建索引,即Ids,名称等.不要在Male/Female列上创建它们.
Ian*_*ter 15
但是列值的更新不会对索引值产生任何影响.对?
否.更新索引列会产生影响.Oracle 11g 性能手册指出:
修改索引列的UPDATE语句和修改索引表的INSERT和DELETE语句比没有索引的时间要长.此类SQL语句必须修改表中索引和数据中的数据.他们还创建了额外的撤消和重做.
所以底线是当我的列用于两个表之间的连接时,我们应该考虑在连接中使用的列上创建索引,但是可以跳过所有其他列,因为如果我们在它们上创建索引,则会在新值时涉及更新索引值的额外成本插入列中.对?
不只是插入,而是任何其他数据操作语言语句.
考虑这种情况...索引会在这里帮忙吗?
关于最后一段,为什么不构建一些具有代表性数据量的测试用例,以便证明或反驳您应该索引哪些列的假设?