删除和重新创建索引与使用dbms.gather_index_stats具有相同的效果吗? (它与重建/更新索引具有相同的效果)
或者这两个完全不同的东西是不应该相互比较的?
答案 0 :(得分:2)
不同之处在于,收集统计信息会刷新有关当前索引的元数据,而删除和重新创建索引则是删除并重新创建索引。
也许很容易理解与一个有效例子的区别。所以让我们创建一个表和一个索引:
SQL> create table t23
2 as select object_id as id, object_name as name from user_objects
3 /
Table created.
SQL> create index i23 on t23(id)
2 /
Index created.
SQL> select o.object_id, i.last_analyzed, i.distinct_keys
2 from user_objects o
3 join user_indexes i
4 on (i.index_name = o.object_name)
5 where o.object_type = 'INDEX'
6 and i.index_name = 'I23'
7 /
OBJECT_ID CREATED LAST_ANALYZED DISTINCT_KEYS
---------- -------------------- -------------------- -------------
116353 23-NOV-2013 00:15:39 23-NOV-2013 00:15:39 167
1 row selected.
SQL>
由于11g Oracle在创建索引时会自动收集统计信息。因此索引创建和最后分析显示相同的日期时间。在以前的版本中,我们必须在创建索引后显式收集统计信息。 Find out more
接下来,我们将添加一些数据并刷新统计信息:
SQL> insert into t23 values (9999, 'TEST1')
2 /
1 row created.
SQL> insert into t23 values (-8888, 'TEST 2')
2 /
1 row created.
SQL> exec dbms_stats.gather_index_stats(user, 'I23')
PL/SQL procedure successfully completed.
SQL> select o.object_id, i.last_analyzed, i.distinct_keys
2 from user_objects o
3 join user_indexes i
4 on (i.index_name = o.object_name)
5 where o.object_type = 'INDEX'
6 and i.index_name = 'I23'
7 /
OBJECT_ID CREATED LAST_ANALYZED DISTINCT_KEYS
---------- -------------------- -------------------- -------------
116353 23-NOV-2013 00:15:39 23-NOV-2013 00:26:28 169
1 row selected.
SQL>
现在,与统计信息相关的元数据已更改,但索引是相同的数据库对象。然而,如果我们删除并重新创建索引,我们将得到一个新的数据库对象:
SQL> drop index i23
2 /
Index dropped.
SQL> create index i23 on t23(id)
2 /
Index created.
SQL> select o.object_id, i.last_analyzed, i.distinct_keys
2 from user_objects o
3 join user_indexes i
4 on (i.index_name = o.object_name)
5 where o.object_type = 'INDEX'
6 and i.index_name = 'I23'
7 /
OBJECT_ID CREATED LAST_ANALYZED DISTINCT_KEYS
---------- -------------------- -------------------- -------------
116354 23-NOV-2013 00:27:50 23-NOV-2013 00:27:50 169
1 row selected.
SQL>
在正常操作中,我们几乎不需要删除并重新创建索引。这种技术在加载大量数据时非常适合,并且在非常罕见的索引损坏情况下。由于性能原因(据称它“重新平衡”偏斜的索引),互联网仍然建议定期重建索引的网站,但这些网站没有产生证明长期利益的基准,当然也从未包括时间和重建过程浪费了CPU周期。
“我目前正在尝试处理加载和更新的优化 大量的数据和思考哪个更好“
重建索引比刷新统计数据需要更多工作。显然是正确的,因为重建包括将统计数据作为子任务进行收集。问题是,与丢弃索引并重新创建后续索引相比,对具有索引的表进行批量DML是否更有效。可以更快地将数据加载到没有索引的表中,然后重新创建它们。
这里没有严格的规则:它取决于你拥有多少索引,受影响的行与表的整个大小的比例,是否需要索引来强制执行关系完整性约束等等上。操作之间也存在很大差异:您可能希望删除批量插入的索引,但保留它们以进行更新,具体取决于WHERE子句需要哪些索引以及更新是否影响索引列。
简而言之,您需要对自己的特定方案进行基准测试。在性能问题方面,这通常就是答案。