基于SQL数据库优化的一百万层数据库优化方案
网上有很多关于sql优化的教程,但是都很混乱,已经安排好几天了,写出来与大家分享,有错误和不足之处,也请改正。(1)选择最有效的序列(表名只有基于有效规则SEO /目标= '_blank>优化器):Oracle解析器在FROM子句中的表右左顺序处理,从条款写在表的末尾(基于表驱动表)将首先处理,在FROM子句中包含多个表,你必须选择的记录数在表为基表。如果有3个以上的表连接查询,你需要选择交叉表的下载地址(交叉表)为基表和交叉表是指由其他表引用表。
(2)在WHERE子句连接顺序。:Oracle序列分析的WHERE子句自下而上,根据这一原则,表之间的连接必须写在另一端的条件,这些条件可以过滤出最大数量的记录,必须写在WHERE子句。
(3)使用*避免选择子句:Oracle在解析过程中,将*转换为所有名称,这是通过查询数据字典完成的,这意味着将花费更多的时间。
(4)减少获取= '_blank>数据库:Oracle执行许多任务内部:解析SQL语句,利用估算指标,结合变量,读取数据块,等。
(5)
sql +,sql *表单和
arraysize参数配置,提高检索的数据量=每得到'_blank>数据库访问。建议值是200。
(6)使用解码功能来减少处理时间:使用解码功能可以避免重复扫描同一记录或同一表的重复操作。
(7)将简单的和无关的'_blank得到=数据库访问:如果你有几个简单的获得= '_blank>数据库查询语句,你可以将它们整合到一个查询(即使它们之间没有关系)。
(8)删除重复记录:删除重复记录的最有效的方法(因为数据使用):
从EMP在e.rowid >删除(选择min(x.rowid)从EMP X);
(9)使用截断而不是删除时,删除表中的记录,在一般情况下,回滚段(回滚段)是用于存储的信息可以恢复。如果没有提交事务,Oracle将在返回之前将数据删除回状态(在使用截断条件之前精确地恢复删除命令),没有回滚段存储可以还原任何信息。当命令运行时,数据无法恢复。很少有资源被调用,执行时间将非常短。(如截断只在满桌的截断是不删除,DDL DML)
(10)尽可能使用提交:尽可能地尽可能多地使用程序中的提交,这个程序的性能得到改善,因为需求将释放提交资源并减少提交的释放:用于恢复数据信息的资源。B是C重做锁程序语句日志缓冲区D。Oracle在空间内对3种资源进行成本管理。
(11)替换WHERE子句中的带子句:避免使用有子句,只有在检索完结果集的所有记录之后才被过滤。这个过程需要排序,总操作。如果WHERE子句限制记录的数量,则可以减少开销(非Oracle)子句。对,在哪里,有三可以添加条件,是第一个实现的地方,终于,因为是不过滤仅据统计后满足条件的记录的第一个,它可以减少中间操作数进行处理,据说是最快的速度,在应该比具有速度更快,因为它过滤后的数据总和,在两个表连接时使用,因此在表相比,具有在左边。在这单表查询统计,如果没有过滤条件的计算涉及到的领域,其结果都是一样的,只有在可以使用Rushmore技术,并不能在后者的速度较慢,如果需要计算字段,表示不计算在这之前的字段的值是不确定的,根据书面程序,时间是在计算之前完成,而其在计算后的工作,所以在这种情况下,结果是不同的。在多表连接查询,在比这里更早。首先,根据不同表之间的联接条件,系统首先将多表形成一个临时表,然后过滤通过的地方,然后计算它们,然后过滤通过。因此,如果你想在过滤条件发挥正确的作用,首先要了解当条件工作,然后决定把它放在那里。
(12)降低查询的表:包含子查询的SQL语句,要特别注意减少表的查询。
选择tab_name从表(tab_name,db_ver)=(选择tab_name,从tab_columns = 604 db_ver)
(13)通过内部功能提高SQL效率。复杂的SQL常常牺牲执行效率。掌握以上函数方法在实际工作中的应用,具有重要的现实意义。
(14)使用表别名(别名):当连接SQL语句中的多个表时,请使用表的别名并在每个列上添加别名,这样可以减少分析的时间,减少由列歧义引起的语法错误。
(15)使用存在而不是在,不存在而不是在:许多基于查询表的,为了满足一个条件,通常需要另一个表连接。在这种情况下,使用存在(不存在或存在)通常会提高查询效率。在子查询中。不,子句将执行内部排序和合并。在两种情况下,不是最低效的(因为它在查询表中执行一个完整的表扫描)。为了避免使用不在,我们可以改写成连接(外部或连接)不存在。例子:
(高)SELECT * FROM EMP在EMPNO(基本型)> 0和存在(选择x'from部门dept.deptno = emp.deptno和LOC =公司(选择)从电磁脉冲(低)*基表)> 0,在表empno(选择表的部门LOC = '公司')
(16)识别低效的执行SQL语句:虽然各种图形工具sqlseo /目标=层出不穷'_blank>优化,它总是写SQL工具解决问题的最佳途径。
选择执行,disk_reads,buffer_gets,圆((buffer_gets-disk_reads) / buffer_gets,2)hit_radio,圆(disk_reads /执行,2)reads_per_run,sql_text V sqlarea美元在执行> 0和buffer_gets和(buffer_gets-disk_reads)> 0 / buffer_gets<0.8为4类;
(17)提高效率指数是一个概念,是表的一部分,为了提高数据检索的效率,Oracle使用一个复杂的自平衡树结构。通常,索引查询数据比完整的表扫描快。当Oracle找到最佳路径和UPDATE语句执行查询,oracleseo /目标= '_blank>优化器将使用相同的指数。在多表连接中使用索引也可以提高效率。另一个优点是索引的使用,它提供主键(主键)唯一的验证。对于长或长的原始数据类型,您可以索引几乎所有的列。通常在大表中有效使用特殊索引。当然,您也会发现,在小的扫描表中,使用索引也可以提高效率。虽然使用索引可以查询效率,但也要注意价格指数。它需要存储空间,也需要定期维护,每当表或索引或列中的记录被修改时,索引本身也将被修改。这意味着每个记录的插入、删除、更新将比磁盘i O O支付4, 5倍,因为索引需要存储空间和额外的,不必要的索引将使查询响应时间变慢,因此需要定期重新配置索引。
ALTERINDEXREBUILD
用存在替换替换(18):当提交包含一对多表信息(如部门表和表)查询时,避免使用明显的。在SELECT子句中可以考虑为存在替换,存在使搜索更快速,因为RDBMS核心模块在子查询条件下一次满足并立即返回结果。例子:(低):
选择不同的dept_no,dept_name从部D,EMP在d.dept_no = e.dept_no(效率高):它有很多优点。
(19)服务器/目标= '_blank> SQL语句是大写,因为Oracle总是先解析服务器/目标= '_blank>的SQL语句,并转换成小写字母为大写。
(20)减少在java代码连接器+连接字符串的使用!
(21)避免使用索引列。通常,我们应该避免使用索引列。不会对索引列上的函数产生相同的影响。当Oracle不满足时,它将停止使用索引执行完整的表扫描。
(22)避免使用computed.where条款对索引列。如果索引列是函数,部分,SEO /目标=> '_blank优化器将不使用索引,并使用全表扫描。
例如:效率低:
从.. * 12 > 25000的部门中选择;
效率高:
从…> 25000 12中选择;
(23)效率高:SELECT * > > =代替EMP在deptno > = 4从EMP在低:选择表> 3两者之间的区别是,前者DBMS将直接跳到第一部等于4的记录,后者将查找表3记录第一扫描了超过3条记录的第一部。
(24)通常替换或合并(用于索引列),替换WHERE子句中的OR,将与联合起到更好的效果。使用或将导致对索引列进行完整的表扫描。注意,上述规则只对多个索引列有效。如果列没有索引,查询效率可能是因为您没有选择,只能减少或。在下面的例子中,loc_id和区域是建立在一个高指标。loc_desc,区域:选择loc_id,从位置loc_id联盟选择= 10 loc_id,loc_desc,从位置区=墨尔本选择区域:loc_id,loc_desc,低区的位置或区域loc_id = 10 =墨尔本如果你坚持使用,你需要至少索引列的记录写回在前面。
(25)以取代或这是一个简单的方法来记住规则,而且测试的实际实施效果,Oracle8i数据库,执行路径似乎是相同的。
低效率:
从位置的选择…loc_id = 10或loc_id = 20或loc_id = 30
高效
SELECT...FROM LOCATION WHERE LOC_IN IN (10,20,30);
(26)避免使用空的列索引,而索引中的空值可以避免使用任何空列,Oracle将无法使用索引。对于单个索引,如果列包含NULL值,则该记录将不存在索引。对于复合索引,如果每个列为空,则索引也有记录。如果至少有一列不是空的,则索引中的记录。例如:如果唯一的索引基于表的A和B列,表中有一个记录,B值(123,null),Oracle将不接受B(123,空)记录(插入)相同的A值。但是,如果索引列全部为空,Oracle会认为密钥是空的,空的不是空的。因此,您可以插入1000个具有相同键值的记录,当然它们是空的!值不存在于索引列中,因此与WHERE子句中的索引列的空值比较使Oracle禁用索引。无效的:(索引失败)
从部门dept_code不空选择…;有效:(指数有效)部门在dept_code > = 0选择;
(27)第一列总是使用索引:如果指数是基于多个列,只有在它的第一列(第一列)的WHERE子句中引用,SEO /目标=> '_blank优化器将选择使用索引。这是一个简单而重要的规则,只有引文索引二列时,SEO /目标=> '_blank优化器使用全表扫描和忽视的指标
(28)与union-all取代联盟(如果可能的话):当SQL语句需要联合两个查询结果集,两组结果将合并union-all,然后排名在最后的输出结果。如果使用联合所有而不是联合,那么这是不必要的。因此,它的分类效率将得到提高。注意,联合所有人都将在相同的记录集中重复两个结果的输出。因此,您应该分析从业务需要使用联合的可行性。联盟将对结果进行排序,此操作将用于sort_area_size记忆。这也是非常重要的对于SEO /目标= '_blank>内存优化后。SQL可以用来查询消费排名。
低效率:
选择acct_num,从debit_transactions哪里tran_date = '31-dec-95'union选择acct_num balance_amt,和联盟的选择。
效率高:
选择acct_num,从debit_transactions哪里tran_date = '31-dec-95'union所有选择balance_amt。
(29)使用顺序而不是按顺序:在严格条件下只使用两个子句索引。所有列中的顺序必须包含在索引顺序中,并保持在相同的索引中。所有列中的顺序必须定义为不能使用空索引。顺序索引和WHERE子句并行使用WHERE子句。
例如:
表部包含以下列:
dept_code PK不空不空dept_desc dept_type空
低效:(不使用索引)
选择dept_type部门订单dept_code
效率:(使用索引)
选择dept_code的部门dept_type > 0
(30)避免更改索引列的类型。在比较不同数据类型的数据时,Oracle会自动对列进行简单的类型转换。假设EMPNO是数字类型索引列。
选择…从EMP empno =123在哪里
事实上,在Oracle类型转换之后,语句被转换为:
选择…从EMP在EMPNO = to_number('123)
幸运的是,在索引列上没有出现类型转换,索引的使用没有改变。现在,假设emp_type是一个字符型的索引列。
从EMP在emp_type = 123选择…
此语句由Oracle转换为:
从EMP whereto_number选择…(emp_type)= 123
因为转换的地方类型,索引不会被使用,以避免Oracle的类型!sql隐式转换,最好使用显式类型转换性能。注意,在比较字符和值时,Oracle会优先考虑字符类型的数字类型转换。
(31)到WHERE子句:注意SELECT语句中的WHERE子句不使用某些索引。下面是一些例子。在下面的示例中,(1)!=不使用索引。记住,索引只能告诉你表中存在什么,但不能告诉你表中没有什么。(2) is ||'connection function. 像其他字符一样禁用索引。(3)+是数学函数。像其他禁用索引的数学函数一样。(4)相同的索引列不能相互比较,这将启用一个完整的表扫描。
(32)a.如果记录数超过30%的数据检索表的数量。使用索引不会显著提高B的效率。在某些情况下,使用索引可能比全表扫描慢得多,但这是同一量级的差别。通常,要阻止几次甚至数千次使用索引时间比使用完整的表扫描要好得多!
(33)避免使用资源消耗的操作:
明确的,联合,减号,交集,SQL的顺序
语句将启动SQL引擎来执行资源密集型排序(排序)。区分需要排序操作,而其他需要至少执行两种排序。通常,使用联合,减号,SQL的交叉语句可以用其他方式使用。如果你重写得到= '_blank>数据库部署sort_area_size,使用联盟减、相交,可以考虑,毕竟,他们的可读性强
(34)SEO /目标= '_blank>优化组:提高报表组有效率。它可以过滤出组以前不需要的记录。下面两个查询返回相同的结果,但是第二个查询显然更快。
低效率:
从EMP组中选择工作,AVG(萨尔)
效率高:
从工作或工作或管理者或管理者或管理者中选择工作(AVG)