数据库 – Oracle – 创建索引或添加列后需要计算统计信息吗?

前端之家收集整理的这篇文章主要介绍了数据库 – Oracle – 创建索引或添加列后需要计算统计信息吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们在Production中使用Oracle 10.2.0.5数据库.

优化器处于“基于成本”模式.

以后需要计算统计信息(DBMS_STATS包)吗?

>创建一个新的索引
>添加
>创建一个新的表

谢谢

解决方法

没有简短的答案.它完全取决于你的数据和你如何使用它.这里有一些需要考虑的事情:

由于@NullUserException指出,通常每天晚上都会自动收集统计信息.这通常够好在大多数(OLTP)环境中,如果您刚刚添加新对象,则在统计信息自动收集之前不会包含大量数据.计划不会那么糟糕,如果这些对象是新的,他们可能不会很快被使用.

>创建一个新的指数 – No. “Oracle Database now automatically collects statistics during index creation and rebuild”.
>添加列 – 也许.如果该列将在连接和谓词中使用,则可能需要统计信息.如果它只是用于存储和显示数据,它不会真正影响任何计划.但是,如果新列占用了大量空间,可能会显着改变平均行长度,块数,行链接等,优化器应该知道这一点.
>创建一个新的表 – 大概.甲骨文能够补偿到dynamic sampling年的失踪统计数据,尽管这通常还不够好.特别是如果新表有很多数据;糟糕的统计数据几乎总是导致低估基数,当您想要哈希连接时,这将导致嵌套循环.而且,即使表格数据没有改变,也可能需要再次收集统计信息以启用直方图.默认情况下,Oracle会为倾斜数据创建直方图,但是如果这些列尚未用作谓词,则不会启用这些直方图. (所以这也适用于添加一个新的列).如果您删除并重新创建表,即使使用相同的名称,Oracle也不会维护任何该列使用数据,并且不知道您需要某些列上的直方图.

收集优化器的统计数据比大多数人都意识到的要困难得多.在我目前的工作中,我们的大多数性能问题最终都是因为统计数据不佳.如果你想为你的系统制定一个计划,你应该读Managing Optimizer Statistics chapter.

更新:

没有必要收集空对象的统计信息;动态采样将与从数据字典中读取统计数据一样快. (基于快速测试,解析大量具有和不具有统计信息的查询)如果禁用动态抽样,那么可能会出现一些奇怪的情况,即Oracle的默认值会导致计算不准确,您将更好地了解统计信息一张空桌子.

我认为Oracle在创建时自动收集索引的统计数据的原因是因为它的成本不高.创建索引时,必须读取表中的所有块,因此Oracle可能会同时计算级别,块,密钥等的数量.

统计可能更复杂,可能需要多遍数据.与可以用作create-table-as-select的一部分的任意sql相比,创建索引相对简单.使用这些任意sql语句并将其转换为也返回收集统计信息所需的信息的查询可能是不可能或有效的.

当然,收集空表的统计数据并不需要任何额外的费用.但是它也不会获得任何东西,只要看到USER_TABLES.LAST_ANALYZED的用户看起来就被分析,但没有任何有意义的数据,那么这只会是误导的.

猜你在找的MsSQL相关文章