网站是如何做的,人才招聘网站建设方案,wordpress 数据库 恢复,seo营销外包公司Oracle使用基于代价的优化方式#xff0c;CBO优化器 cost based optimization优化器主要参考的是表和索引的统计信息#xff0c;统计信息给出表的大小 有多少行等信息#xff0c;过期的统计信息会让优化器做出一个错误的执行计划#xff0c;因此要及时刷新统计信息。1. Ora…Oracle使用基于代价的优化方式CBO优化器cost based optimization优化器主要参考的是表和索引的统计信息统计信息给出表的大小 有多少行等信息过期的统计信息会让优化器做出一个错误的执行计划因此要及时刷新统计信息。1. Oracle统计信息优化器要根据表索引中的数据来选择查询数据的方式由于表中的数据量很大不可能每次执行查询时实时的统计表中的数据量及数据分布所以要定期刷新把表和索引的大小行数信息保存到数据字典里供优化器使用这就是统计信息。统计信息包括表索引表分区索引分区列等我们主要关注表和索引的统计信息统计信息脚本每天6点12点刷新一次查看表统计信息select table_name,num_rows,last_analyzed from dba_tables where table_namenum_rows 数据量last_analyzed 统计信息刷新的时间查看索引统计信息select table_name,index_name,num_rows,last_analyzed from dba_indexes where table_name表分区统计信息dba_tab_partitions索引分区统计信息dba_ind_partitions手工刷新统计信息exec dbms_stats.gather_table_stats(ownnamesumdb, tabnamettt);2. Oracle执行计划执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述2.1 查看执行计划autotrace是Oracle自带的工具可以展示执行计划。set autotrace traceonlyset timing onSQL语句然后select * from table(dbms_xplan.display());或根据sqlid查看该sql当时的执行计划select * from table(dbms_xplan.display_awr(sqlid,null,null,ADVANCED));查看历史执行计划根据sqlidselect * from table(dbms_xplan.display_awr(sqlid))高斯数据库查看执行计划explain SQL语句执行计划的顺序是从上到下从右到左口诀缩进最深的最先执行缩进相同的先上后下2.2 执行计划有三方面要考虑访问路径连接方式和连接顺序注意执行计划里表的行数Rows是根据统计信息刷新的索引数据估算的不是准确的。另外行数是条件过滤后的不是全表行数。表访问数据的方法包括全表扫描table access fullrowid扫描table access by rowid索引扫描table access by index scan,索引扫描又分为索引唯一扫描 index unique scan,索引全扫描 index full scan,索引范围扫描 index range scan多表连接方法如果查询涉及多个表的连接操作join关键字用于将两张表做连接nested loop join 嵌套循环连接hash join 散列连接sort merge join 排序合并连接cross join 笛卡尔连接详解nested loop对于被连接的数据子集较小的情况嵌套循环连接是个较好的选择。在嵌套循环中内表被外表驱动要把返回子集较小的表作为外表默认外表是驱动表而且在内表的连接字段上一定要有索引。步骤确定一个驱动表(外表)另一个表为内表驱动表中的每一行与内表中的相应记录JOIN。类似一个嵌套的循环。适用于驱动表的记录集较小(小于一万)而且内表需要有索引。需要注意join的顺序很重要驱动表的记录集一定要小耗时最小。hash join散列连接是做大数据集连接时的常用方式优化器使用两个表中较小的表利用连接键在内存中建立散列表(build 表)然后扫描较大的表(probe 表)并探测散列表找出与散列表匹配的行。哈希连接不适用于不等价连接条件(, ,,,,like )在内存中使用hash table来存放结合数据通常会先访问数据量小的表之后再访问数据量多的表这样能保证性能。select /* leading(a) use_hash(a,b) */ a.col1,b.col2 from table1 a, table2 b where a.col1b.col2上面语句中 /* leading(a) use_hash(a,b) */ 是Hint提示提示和注释很像提示不一定能生效当提示错误时优化器会忽略提示而不会报错。通过Hint来控制SQL查询中的hash join操作leading 指定hash join顺序。指定驱动表use_hash 指定使用hash joinsort merge join通常用在没有索引并且数据已经排序的情况。分组聚合hash group by注意group by 后有对字段进行order by 的情况无法使用hash grouo by。而会使用sort group by ,它会自动排序分组字段hash group by不保证结果集的顺序。解决方法使用子查询先进行group.by 操作然后再外层查询使用order by子句进行排序。————————————————版权声明本文为CSDN博主「xiaomin-Michael」的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。原文链接https://blog.csdn.net/m0_74674329/article/details/143776377