我发现文件解释说,oracle使用这些进行性能调优等,但不太明白,它实际上做了什么。有人可以用简单的例子或简单的例子来解释一下吗?他们为什么使用DBMS_STATS.GATHER_TABLE_STATS?
3
A
回答
28
大多数企业数据库(包括Oracle)都使用基于成本的优化器来为给定的SQL语句确定适当的查询计划。这意味着优化器使用关于数据的信息来确定如何执行查询而不是依赖规则(这是较早的基于规则的优化器所做的)。
例如,假设一个表,一个简单的错误跟踪应用程序
CREATE TABLE issues (
issue_id number primary key,
issue_text clob,
issue_status varchar2(10)
);
CREATE INDEX idx_issue_status
ON issues(issue_status);
如果我是一家大公司,我可能会在此表一个百万行。其中,100个具有ACTIVE的issue_status
,10,000个具有QUEUED的issue_status
,并且989,900具有COMPLETE的状态。如果我想针对表执行查询以查找我的活动问题
SELECT *
FROM issues
WHERE issue_status = 'ACTIVE'
优化程序有一个选项。它可以使用issue_status
上的索引,然后在表中为索引中匹配的每一行执行单行查找,或者可以对issues
表执行表扫描。哪个计划更有效率取决于表中的数据。如果Oracle希望查询返回表中一小部分数据,那么使用索引会更有效。如果Oracle希望查询返回表中大部分数据,则表扫描会更有效。
DBMS_STATS.GATHER_TABLE_STATS
是什么合并让Oracle做出这个决定的统计。它告诉Oracle,表中大约有100万行,issue_status
列有3个不同的值,并且数据分布不均匀。因此,Oracle知道使用查询索引来查找所有活动问题。但它也知道,当你转身试图寻找所有关闭的问题
SELECT *
FROM issues
WHERE issue_status = 'CLOSED'
它会更有效地执行表扫描。
收集统计信息允许查询计划随着数据量和数据分布的变化随时间变化。当您第一次安装问题跟踪器时,您将遇到很少的COMPLETED问题以及更多ACTIVE和QUEUED问题。随着时间的推移,完成问题的数量上升得更快。随着您在表格中获得更多行并且处于不同状态的那些行的相对部分发生更改,查询计划将发生变化,因此在理想的情况下,您始终可以获得最有效的计划。
相关问题
- 1. 什么是堆栈用于?他们为什么使用C++?
- 2. 泡菜:他们为什么这么叫?
- 3. 他们使用什么样的控件?
- 4. 为什么他们两个不相等
- 5. 外键 - 他们为我做了什么?
- 6. 他们为什么互相粘着?
- 7. 为什么他们有相同的ID?
- 8. 为什么他们一直呈现
- 9. 为什么他们创建超时
- 10. 为什么当他们改变
- 11. 他们为什么叫做“四人帮”?
- 12. 为什么他们在JavaScript中使用名称空间?
- 13. C++中的堆栈。他们为什么以及何时使用?
- 14. 软件架构师做什么,他们使用什么程序?
- 15. 装配需要什么?为什么我们使用它们?
- 16. 什么是压缩机模块?他们为什么重要?如何使用它?
- 17. 为什么人们将他们的文件命名为index.html?
- 18. MySQL加入?他们是什么?何时使用它们?
- 19. 什么是GeneratedMethodAccessor1,2等,为什么他们不能找到?
- 20. 什么是Node.js分离?他们为什么现在死了?
- 21. 这些角色是什么,他们为什么这样渲染?
- 22. 什么是Android以及他们为什么创建新的VM?
- 23. 什么是嵌套函数?他们是为了什么?
- 24. 为什么我们使用内部类?
- 25. 为什么我们使用Groovy中
- 26. 为什么我们使用canvas.save或canvas.restore?
- 27. 为什么我们使用ChangeAwareList和ChangeAwareMap
- 28. 为什么我们使用AutoCompleteTextView
- 29. pixel.gif,为什么人们使用它?
- 30. 为什么我们在jQuery中使用“({})”?
非常感谢贾斯汀,这很有道理。 – Manth 2013-03-25 16:43:04
看了很多关于GATHER_TABLE_STATS的文档,这个很好解释。感谢分享你的想法! – 2016-06-29 16:15:36