Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 收集索引上的统计数据还是创建?_Sql_Performance_Oracle_Indexing_Bulk Load - Fatal编程技术网

Sql 收集索引上的统计数据还是创建?

Sql 收集索引上的统计数据还是创建?,sql,performance,oracle,indexing,bulk-load,Sql,Performance,Oracle,Indexing,Bulk Load,删除和重新创建索引是否与使用dbms.gather\u index\u stats具有相同的效果?(其效果是否与重建/更新索引相同) 或者这两个完全不同的东西不应该相互比较吗?区别在于,收集统计数据会刷新当前索引的元数据,而删除和重新创建索引就是,呃,删除和重新创建索引 也许通过一个工作过的例子很容易理解这种差异。让我们创建一个表和一个索引: SQL> create table t23 2 as select object_id as id, object_name as name

删除和重新创建索引是否与使用dbms.gather\u index\u stats具有相同的效果?(其效果是否与重建/更新索引相同)


或者这两个完全不同的东西不应该相互比较吗?

区别在于,收集统计数据会刷新当前索引的元数据,而删除和重新创建索引就是,呃,删除和重新创建索引

也许通过一个工作过的例子很容易理解这种差异。让我们创建一个表和一个索引:

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在创建索引时会自动收集统计数据。因此,索引创建和上次分析显示相同的日期时间。在以前的版本中,我们必须在创建索引后显式收集统计数据

接下来,我们将添加一些数据并刷新统计信息:

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子句需要什么索引以及更新是否影响索引列


简而言之,您需要对自己的特定场景进行基准测试。这通常是性能问题的答案。

我不知道:烧掉一本书和计算一本书的页数有相同的效果吗?@APC我猜烧掉的部分指的是删除,而计数指的是索引重建。那么索引的重新创建呢?在这种情况下,你是否有一个聪明的类比,以便我更好地理解这个主题?谢谢你,好先生。我目前正试图处理加载和更新大量数据的优化问题,并思考哪种方法更好,是收集统计数据还是直接删除并重建索引,我认为你的回答相当概括了我将如何处理我的数据。如果你不介意,您还可以简单地解释一下仅仅禁用索引/约束与删除/重新创建之间的区别吗?或者这是一个完全不同的话题?如果是这样的话,我将为此创建一个新问题。顺便说一句,对于sql示例,您当然可以从我的Internet上获得解释