我看网上有很多介绍数据库查询如何优化的,却没有人提到具体的数据库产品自身如何对SQL如何做优化。
我想简单了解一下数据库对复合查询、大表链接会做什么样的优化,算法上、内存磁盘管理上都可以。请任举Oracle、MySQL、SQLite为例都行。
感觉数据库是一个大黑盒,有人告诉我数据库会优化复合查询,所以能写复合查询就不要自己拆开写。有人告诉我,数据库在处理大数据的时候,会根据数据量的大小来决定中间结果是写入内存还是还是写入硬盘,所以,不要自己擅用临时表。
所以想要了解一下数据库的一些优化方案,而不是自己盲目去学习所谓别人总结出来的“优化法则”。
所以请列举一些数据库产品,如MySQL会做的一些优化项。
oracle内部有个优化器,以前是RBO,现在都改用CBO了。CBO有三个组件:
查询转换器(Query Transformer)
评估器(Estimator)
计划生成器(Plan Generator)
这概念就比较多了,简单描述一下吧:
查询转换器--查询语句的形式会影响所产生的执行计划,查询转换器的作用就是改变查询语句的形式以产生较好的执行计划。有以下几种转换技术:视图合并(View Merging)、谓词推入(Predicate Pushing)、子查询反嵌套(Subquery Unnesting)、物化视图的查询重写(Query Rewrite with Materialized Views)和OR扩展(OR-expansion)。
评估器--评估器通过计算三个值来评估计划的总体成本:选择性(Selectivity)、基数(Cardinality)、成本(Cost)。
计划生成器--计划生成器的作用就是生成不同的执行计划,然后选择其中总体成本最低的一个。
由于不同的访问路径、连接方式和连接顺序可以任意组合,虽然以不同的方式访问和处理数据,但是可以产生同样的结果,因此一个SQL可能存在大量不同的执行计划。
这就是sql语句被解析生成执行执行计划的流程。优化器参考统计信息,决定sql的执行计划。比如两张表关联,哪张表作为驱动表,是否使用索引等。
不知道你所说的复合查询是个什么概念,如果是指包含子查询的查询,那么建议你最好不要这么干,oracle会改写子查询或者视图,但改写的效果可能很差。能不用就不要用,或者减少子查询和视图的嵌套。
感觉数据库是一个大黑盒,有人告诉我数据库会优化复合查询,所以能写复合查询就不要自己拆开写。有人告诉我,数据库在处理大数据的时候,会根据数据量的大小来决定中间结果是写入内存还是还是写入硬盘,所以,不要自己擅用临时表。
所以想要了解一下数据库的一些优化方案,而不是自己盲目去学习所谓别人总结出来的“优化法则”。
所以请列举一些数据库产品,如MySQL会做的一些优化项。
ORACLE优化SQL语句,提高效率(2)
索引是表的一个概念部分 用来提高检索数据的效率 Oracle使用了一个复杂的自平衡B tree结构 通常 通过索引查询数据比全表扫描要快 当 Oracle找出执行查询和Update语句的最好路径时 Oracle优化器将使用索引 同样在联结多个表时使用索引也能够提高效率 另一个使用索引的好处是 他提供了主键(primary key)的唯...
oracle数据库有哪两种优化模式
Oracle的优化器共有两种的优化方式,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO)A、RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。B、CBO方式:依...
oracle 10g sql 优化
4.减少查询往返和查询的表 这也是很简单的大道理,程序与Oracle交互的成本极高,所以一个查询能完成的不要分开两次查,如果一个循环执行1万条查询的,怎么都快不到哪里去了。4.1 封装PL\/SQL存储过程 最高级的做法是把循环的操作封装到PL\/SQL写的存储过程里,因为存储过程都在服务端执行,所以没有...
sql查询如何优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断,应尽量避免在 where 子句中使用!=或<>操作符,应尽量避免在 where 子句中使用 or 来连接条件因为以上的查询会导致导致引擎放弃使用索引而进行全表...
oracle数据库查询?
图中 SQL 语句首先确定了当前日期和近三年的开始日期,然后在子查询中按照事件发生时间的月日进行分组统计事件数量,最后在外部查询中求出这些分组统计结果中的最大事件数和最小事件数。请注意:上述代码基于 MySQL 数据库,不同的数据库语法可能略有不同,需要根据实际情况进行调整。确保表格中的事件时间...
如何提高ORACLE数据库的查询统计速度
以oracle 数据库系统为例 我们在开发大型oracle数据库系统时结合项目的特点 本着安全 高效的原则对数据库进行了一些物理设计 从而大大提高了数据库的查询统计速度 总结为如下几点 )扩大数据表空间到 M 用于存放本系统的数据;)段盘区的初始大小为 K 增长大小为 K 增长幅度为 ;)用户临时空间增大 M;)...
九大Oracle性能优化基本方法详解
Oracle性能优化基本方法包括一下几个步骤 包括 )设立合理的Oracle性能优化目标 )测量并记录当前的Oracle性能 )确定当前Oracle性能瓶颈(Oracle等待什么 哪些SQL语句是该等待事件的成分))把等待事件记入跟踪文件 )确定当前的OS瓶颈 )优化所需的成分(应用程序 数据库 I\/O 争用 OS等))跟踪并实施更改...
oracle 查询的sql语句特别慢,是什么原因,是or特别慢吗,用什么优化,急...
把查询计划的内容发出来,你这一大堆代码谁能看出来啥啊。看你的代码这么长,条件那么多,语句用了函数,很多低效的or,not in等操作,另外还用了group by,order by,左右连接等等,如果表数据量很大的话,你这个语句性能不好是预料中的事情。如果你这条语句无法优化,建议从调整表结构角度考虑 ...
宜信DBA实践-SQL优化|一篇文章说清楚Oracle Hint的正确使用姿势_百度...
在构建表后,使用提示(如INDEX)调整访问路径,优化查询性能。在某些情况下,提示可能因特定条件而被忽略,如索引对空值的处理。提示(Hint)是Oracle数据库优化中的重要工具,能够有效调整执行计划,提升SQL语句的执行效率。然而,使用提示时需注意其局限性和可能的副作用,应谨慎并灵活地应用于实际场景。
orcal数据库简介
一、基本概述 Oracle数据库提供了一个全面的数据处理和存储解决方案,支持大型数据集的处理,并且具有强大的数据管理功能。它支持多种数据类型,包括字符、数值、日期等,并能有效地管理这些数据的存储、检索和更新。Oracle数据库支持SQL语言进行数据的查询和操作,同时也提供了丰富的API接口,方便开发者进行...