大数据表,按某字段T(Varchar型的时间字段)分区,一个月一个分区。有常用业务字段A和B(其它字段并不重要),字段A值的重复率不高,B的重复率稍高。建有索引1:A,组合索引2:T,B。
对该表的常用查询有两种:通过条件T、A查询,通过条件T、B查询。
原来应用一直正常,近期由于其它分区表查询索引选择策略不优化的问题,对所有大数据表的分区表进行数据分析(1%抽样,对数据和索引进行分析),促使Oracle选用正确的更合适的索引。分析后,其它表的问题解决,但这个表分析后查询速度反面大幅下降。
查看数据库查询的计划,对条件T、A进行查询时(select * from talbe where t between someday and anotherday and a=something order by T desc),当T的范围在一个月分区时,选用索引1,速度在一秒以内,在T范围跨月时,系统选择索引2,速度很慢,要10几秒甚至更多,通过SQL语句强制使用索引1,速度很快,在一秒以内。
问题处理及疑问:
1、以为索引1没带时间信息,造成跨分区查询时选择了不够优化的索引,于是增加一索引3(T, A),重新进行数据分析,但数据库仍没有选择更优的索引,强制使用索引3,发现还没有原索引1快(4秒多)(这是个疑问1,理论上更快的索引反而速度慢,而且慢好几秒)。
2、把索引1修改为全局索引(原为分区索引),问题仍未解决。
3、经过一番折腾,发现有索引3时,把Where条件中的order by T desc的DESC去掉,数据库就能选择索引3的索引。(这是疑问2,DESC对索引选择策略有什么影响,在这里的影响是偶然还是必然?)
4、一个类似的表,有类似的T/A/B字段以及类似的索引2、索引3,当时速度慢,选择的是不优化的索引,就是通过对表进行数据分析,让数据库选择了较优化的索引,但同样的方法使用到这个表反而引起了问题,情况正相反(这是疑问3,数据分析的后果不确定嘛?)
5、这个表数据分析后发生了慢的问题,于是采用Delete分析结果的方法进行回退,但回退后数据库仍选择“错误”的索引(这是疑问4,为什么回退失败?数据库的查询计划和分析结果到底有什么关系?)
6、应用的SQL语句是个组合查询,条件语句是拼出来的,如果在SQL中直接指定索引,一来应用实现起来很麻烦(要根据不同的组合条件拼前面的指定索引语句),二来应用的数据库依赖性增强。除了改应用,到底可不可以通过对分区数据表进行定时分析的方法确保数据库选择更优的索引?数据库对分区表的索引选择策略到底有没有固定可循的原则?(这是疑问5)
为什么Oracle不自动做Analyze?
如果Analyze的利大于弊的话,为什么Oracle不自己做?它完全可以做到实时的/定时的(调度表)/策略的(系统非繁忙时/数据量变化到一定程度时)。我认为Oracle不自动去做是与设计思想有关的,它追求尽量的稳妥,同时也让用户自己去承担Analyze的风险(有点不负责任吧,它在文档中也几乎没有提及作Analyze的风险)。
Analyze 的风险:
先来看两个极端的例子:
例1,假设现有系统已经是最优系统,那么在作了Analyze后,最好的情况是系统效率没有变化,即收益为0。正常的情况是某些原本最佳化的SQL, 在Analyze后由于Cost的变化,Oracle内部优化器选择了一个不同原先最佳的执行计划的新执行计划,性能反而下降了,或者说收益<0。
结论:对于最佳系统,作Analyze后的总体收益<=0。
例2,假设现有系统为最差系统,那么在作了Analyze后,最坏的情况是系统效率没有变化,即收益为0。正常的情况是某些原本最差的SQL,在Analyze后由于Cost的变化,Oracle内部优化器选择了一个不同原先最差的执行计划的新执行计划,性能上升了,或者说收益>0。
结论:对于最差系统,作Analyze后的总体收益>=0。
那么对于正常的系统--介于最佳和最差系统之间的系统,作Analyze后的情况会是什么样呢?收益:a.原先性能很差的SQL性能提高了。b.一部分性能不错的SQL,性能又再一步提高了(少数)。损失:a.一部分性能很差的SQL,性能更差了(少数)。b.一部分性能不错的SQL,性能下降了--------注意这一点。
结论:对于正常系统,作Analyze后的收益不可知!!!!!!!!!!!!!
正是这个不可知产生了风险。对于一个生产系统,在作Analyze前,你可以明确的知道瓶颈在那里(虽然系统性能在逐渐下降中),但在Analyze后,你只能祈求上帝了,因为你根本不知道什么地方性能会下降,什么地方性能会上升(系统性能产生了不可预知的急剧变化)。假设只有一条SQL的性能下降了,999条性能提高了,那么你的系统的性能提高了吗?未必,下降的那条可能每天需要运行几千万次:),整体性能可能还是下降了。想看性能下降的例子?请看 http://www.itpub.net/showthread.php?s=&threadid=27994
总结:作Analyze的风险在于你不知道Analyze后,那一部分的性能会提高,那一部分的性能会下降,也不知道整体的性能会下降还是提高。或者说作Analyze会把系统性能推入一个不可预知的状态。
现在你知道为什么oracle不自动作Analyze了吧:)
相关推荐
执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就可能要几十表了. 这是因为ORACLE只对...
Oracle 9i Client (Oracle 9i 客户端) 简化版 (不安装Oracle客户端,也可以使用PLSQL Developer 不用安装Oracle客户端也可以使用PLSQL Developer 绿色! 安全! 轻便! 可靠! 1、本软件可作为简单的Oracle9i客户端...
首先,Oracle.ManagedDataAccess是Oracle公司提供的一个纯.NET框架的客户端驱动,它允许开发者在不安装Oracle客户端的情况下,直接与Oracle数据库进行交互。这个库包含了所有必要的组件,使得C#程序可以方便地执行...
这是一本关于ORACLE性能调整与优化的资料
Oracle Client是Oracle公司提供的数据库连接工具,用于与Oracle数据库服务器进行通信。19C是Oracle Database的一个版本,代表第19个主要版本。这个压缩包包含的Oracle Client适用于Windows和Linux操作系统,使得...
Oracle JDBC驱动包是Oracle数据库与Java应用程序之间进行通信的关键组件,它使得Java程序员能够通过编写Java代码来操作Oracle数据库。标题中的"ojdbc6"指的是Oracle JDBC驱动的一个特定版本,适用于Java SE 6环境。...
cx_Oracle是Python数据库API规范的实现,用于访问Oracle数据库。目前,该模块经过对Oracle客户端版本11.2、12.1和12.2以及Python版本2.7、3.4、3.5和3.6的测试。cx_Oracle遵循开源的BSD许可证,这表示用户可以自由地...
《Oracle 12c数据库基础教程》教学课件—03Oracle数据库管理工具.pdf《Oracle 12c数据库基础教程》教学课件—03Oracle数据库管理工具.pdf《Oracle 12c数据库基础教程》教学课件—03Oracle数据库管理工具.pdf《Oracle...
oci.dll是Oracle Call Interface的缩写,它是Oracle数据库的一个核心组件,允许开发者使用各种编程语言与Oracle数据库进行交互。在Oracle 10G和11G版本中,oci.dll扮演了至关重要的角色,为应用程序提供了访问数据库...
Dbmover for Mysql to Oracle 是高效的将Mysql导入到Oracle数据库的工具。 使用DBMover可以灵活定义Mysql和Oracle之间表和字段的对照关系,也可以在DBMover创建一个查询,把查询结果当作源表转入到Oracle中。 ...
标题中的“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本”是一个常见的错误提示,它涉及到在.NET环境中使用Oracle数据库时遇到的问题。这个错误表明,当你试图在应用程序中使用System.Data....
Veeam 备份恢复 Oracle 数据库详细配置文档 本文档旨在详细介绍如何使用 Veeam 备份恢复 Oracle 数据库的配置过程。该文档将指导读者从环境准备到推送 Oracle RMAN Plugin,再到创建备份作业和运行备份作业,最后...
cx_Oracle是Python编程语言中用于连接Oracle数据库的一个模块。该模块遵循Python数据库API规范,并且适用于Oracle 11.2和12.1版本,同时兼容Python 2.x和3.x版本。cx_Oracle模块通过使用Oracle客户端库来实现与...
使用了,ODP.NET 方式链接数据库,只要把Oracle.ManagedDataAccess.dll引入取代以前的Oracle.DataAccess.dll即可。 这种方式也是oracle公司提供的,稳定性要比之前那种更好,而且也是免安装客户端的,目前还没测试...
关于NETWORK文件,通常在Oracle环境中指的是网络配置文件,如tnsnames.ora。这个文件定义了Oracle数据库的服务名,包含服务器的主机名、端口和SID等信息。在没有完整Oracle客户端的情况下,可能需要手动配置这个文件...
Oracle Instant Client 11.2.0.1.0是轻量级Oracle客户端,用于连接访问Oracle 9i、10g、11g 11.2.0.1.0版本的Oracle数据库。 Oracle Instant Client11.2.0.1.0 安装程序包含OCI/ OCCI、JDBC-OCI SDK(软件开发工具...
python-oracledb的源码和使用示例代码, python-oracledb 1.0,适用于Python versions 3.6 through 3.10. Oracle Database; This directory contains samples for python-oracledb. 1. The schemas and SQL ...
关于Oracle数据库死锁问题的研究与讨论
Oracle.ManagedDataAccess.Catalog.xml文件可能包含了关于ODP.NET Managed Driver的元数据,这些信息通常用于帮助.NET Framework正确地加载和识别Oracle的数据类型和函数。而Oracle.ManagedDataAccess.Client....
Oracle 19c是Oracle数据库的一个重要版本,尤其在Windows平台上,它提供了全面的功能和优化,使得数据库管理和开发更为高效。以下将详细讲解Oracle 19c Windows客户端的关键知识点: 1. **Oracle Client**: Oracle...