如何优化sql语句

如何优化sql语句
(1)选择最有效的表名称顺序(仅在基于规则的优化器中有效):
在FROM子句中从右到左的顺序表按照Oracle解析器,FROM子句中写在表的末尾(基于表驱动表)将首先处理,在FROM子句中包含多个表,你必须选择的记录数在表的基表。如果有3个以上的表连接查询,我们需要选择交叉表(交叉表)为基表和交叉表是指由其他表参考表。
(2)WHERE子句中的连接顺序:
Oracle使用自底向上序列解析WHERE子句。根据这个原则,表之间的连接必须写在其他条件之前。可以筛选出最多记录数的条件必须写在WHERE子句的结尾处。
(3)使用*避免选择子句:
Oracle在解析过程中,将*转换为所有的名称,这是通过查询数据字典完成的,这意味着会有更多的时间消耗。
(4)减少访问数据库的次数:
Oracle在内部执行许多工作:解析SQL语句、估算索引的利用率、绑定变量、读取数据块等等。
(5)在SQL*Plus复位arraysize参数、SQL Forms和PRO*C能提高检索的数据为每个数据库的访问量,并建议值是200。
(6)使用解码功能来减少处理时间:
使用解码功能可以避免重复扫描同一记录或重复同一表。
(7)集成简单的、无关的数据库访问:
如果有几个简单的数据库查询语句,可以将它们集成到查询中(即使它们之间没有关系)。
(8)删除重复记录:
删除重复记录的最有效的方法(因为数据使用):
复制代码代码如下所示:
从EMP在e.rowid >删除(选择min(x.rowid)
从EMP在x.emp_no = e.emp_no)X;

(9)用截短替换删除:
当删除表中的记录,在一般情况下,回滚段(回滚段)是用于存储的信息可以恢复。如果没有提交事务,Oracle将在使用截断、回滚之前,将数据返回到状态(在执行删除命令状态之前进行精确恢复),而不再存储任何可以恢复的信息。当命令运行时,数据无法恢复。所以一些资源调用和执行的时间会很短。(截断仅适用于删除全表,将不是DDL DML)。
(10)尽可能多地使用提交:
尽可能使用程序中尽可能多的提交,从而提高程序的性能,并通过提交释放的资源来减少需求。提交所释放的资源如下:
用于恢复a回滚段上的数据的信息。
b.程序语句获取的锁。
重做日志缓冲区。
Oracle是管理这3种资源的内部成本。
(11)用WHERE子句取代有保留子句:
为了避免使用带子句,只对结果集进行过滤,直到检索到所有记录。这个过程需要排序、总计和其他操作。如果记录数可以限制通过WHERE子句,可以减少。(非Oracle),在那里,有这三条可以添加条件,是第一个实现的地方,终于,因为是不符合条件的记录过滤后仅统计第一,它可以减少数据的中间业务处理,按理说应该速度最快,也应该比在哪里,因为它过滤后的数据总和,在两个表连接时使用,因此在表相比,具有在左边。在这单表查询统计,如果没有过滤条件的计算涉及到的领域,其结果都是一样的,只有在CAn使用Rushmore技术,并不能在后者的速度较慢,如果需要计算的领域,说没有计算之前这个字段的值是不确定的,根据书面程序,时间是在计算之前完成,而其在计算后的工作,所以在这种情况下,结果是不同的。在多表连接查询,在比在更早期。首先,根据不同表之间的联接条件,系统首先将多表形成一个临时表,然后过滤通过的地方,然后计算它们,然后过滤通过。因此,如果你想在过滤条件发挥正确作用,首先要了解当条件应该工作,然后决定把它放在那里。
(12)将查询减少到表中:
在SQL语句中包含子查询,特别要注意减少表的查询实例uff1a。
复制代码代码如下所示:
选择tab_name从表(tab_name,db_ver)=(选择)
tab_name,从tab_columns版本= 604 db_ver)

(13)通过内部功能提高SQL效率:
复杂的SQL常常牺牲执行效率,掌握上述方法的应用功能,解决实际工作中的问题是很有意义的。
(14)使用表别名(别名):
在SQL语句中连接多个表时,使用表的别名,并在每个列上加上别名,这样可以减少解析时间,减少列歧义造成的语法错误
(15)以存在代替,不替换不存在:
在许多基于查询的查询的基础上,为了满足一个条件,往往需要加入另一个表中。在这种情况下,使用存在(或不存在)通常会提高查询效率。在子查询中,在条款的不将执行一个内部的排序和合并。在任何的情况下,不在是最低效的(因为它执行的子查询表的全表遍历)。为了避免使用不在,我们可以把它改写为外部连接(外部连接)或不存在。
实例uff1a
(高效率)
复制代码代码如下所示:
从EMP(基表)中选择*
WHERE EMPNO > 0 AND EXISTS (SELECT 'X' FROM DEPT
在dept.deptno = emp.deptno和LOC =公司
(低效)SELECT * FROM EMP(基表)在EMPNO > 0
和部门在(选择上的部门LOC =公司)

(16)识别低效执行SQL语句:
尽管目前有各种用于SQL优化的图形化工具,但编写自己的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 > 0
和(buffer_gets-disk_reads) / buffer_gets<0.8
4倒序;

(17)按指数提高效率
索引是表的概念部分,它用于提高检索数据的效率。Oracle使用一个复杂的自平衡B-tree结构。一般来说,数据查询通过索引比全表扫描的速度更快。当Oracle发现最佳路径执行查询和更新语句,Oracle的优化器将使用索引,使用索引联接多个表也可以提高效率。使用指数另一个优点是,它提供了一个独特的主键(主键)验证。那些长或LONG RAW数据类型,你可以索引几乎所有的列。通常,使用索引的大表中特别有效。当然,你也会发现,使用索引可以提高效率,扫描一个小桌子的时候。虽然使用索引可以提高查询的效率,我们还必须注意其成本。索引需要空间来存储,也需要定期的维护,和指数本身将被修改时添加记录或表或索引列减少修改。这意味着,插入,删除,和每个记录的更新将支付更多的4和5盘我 / O这个。因为索引需要额外的存储空间和处理,不必要的索引将慢查询的响应时间。有必要重新设定指标定期。
复制代码代码如下所示:
ALTERINDEXREBUILD

(18)替换存在:
避免使用不同的SELECT子句中当你提交一个查询,包含一对多表信息(如部门表和员工表)。一般来说,你可以考虑更换它的存在,存在,使得查询更加快速,因为RDBMS核心模块将在子查询的条件满足后立即返回的结果。实例uff1a
(低效率):
复制代码代码如下所示:
选择不同的dept_no,dept_name从部D,EMP E
在d.dept_no = e.dept_no

(有效率的):
复制代码代码如下所示:
选择dept_no,dept_name从系D存在(选择X
从EMP在e.dept_no = d.dept_no);

(19)SQL语句是大写的,因为Oracle总是先解析SQL语句,然后将小写字母转换成大写字母。
(20)作为连接器+连接字符串中使用java代码少。
(21)避免使用索引列。通常,我们应该避免使用索引列,而不会对索引列上的函数产生同样的影响。当Oracle遇到时,他将停止使用索引来执行一个完整的表扫描。
(22)避免在索引列上使用计算,如果WHERE列是函数的一部分,则在WHERE子句中,优化器将使用一个完整的表扫描而不使用索引。
举个例子:
低效率:
从.. * 12 > 25000的部门中选择;
效率高:
从…> 25000 12中选择;
(23)另有选择>:
效率高:
SELECT * FROM EMP在deptno > = 4
低效率:
SELECT * FROM EMP在deptno > 3
两者的区别是,前者DBMS将直接跳到第一部等于4,后者将首先确定表3记录扫描到第一部记录大于3。
(24)替换或合并(适用于索引列):
一般来说,替换或在WHERE子句中使用联合会有很好的效果。使用或索引列将导致一个完整的表扫描。注意,以上规则只适用于多个索引列。如果列被索引,查询效率可能是因为你没有选择或减少。在下面的例子中,都loc_id区域索引。
效率高:
复制代码代码如下所示:
选择loc_id,loc_desc,区
位置
在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
High efficiency:
从位置loc_in(10、20、30)选择;
(26)避免在索引列中使用NULL而不是NULL:
避免使用索引中的空列,Oracle将不能使用索引。对于单个列索引,如果列包含空值,则该记录将不存在于索引中。对于复合索引,如果每个列为空,则索引中没有这样的记录。如果至少有一个列不为空,然后记录在索引中。例如:如果唯一性索引是基于表的列和B柱,并有一个记录表中,和b值(123,null),Oracle将不接受同一和b值下的记录(123,null)。然而,如果所有的索引列是空的,Oracle会认为整个关键是空的,空不等于零。所以你可以插入1000条记录具有相同的核心价值观,当然,他们都是空的!因为索引列中不存在空值,所以WHERE子句中的索引列的空比较将使Oracle停止索引。
低效:(索引失败)
从部门dept_code是无效的选择;
效率:(索引有效)
从部门dept_code > = 0选择;
(27)索引的第一列总是被使用:
如果索引建立在多个列上,优化器只在WHERE子句引用其第一列(前导列)时选择索引,这也是一个简单而重要的规则。当引用索引的第二列时,优化器使用一个完整的表扫描,忽略索引。
(28)与union-all取代联盟(如果可能的话):
当SQL语句需要联合两个查询结果集,两结果集将合并在union-all方式,然后排序之前,输出最终结果。如果联盟所有代替联盟,这种排序是不必要的,效率也提高了。需要注意的是,联盟将在两个结果设置输出重复相同的记录重要。所以你还需要对使用联盟所有业务的可行性需求分析。联盟将排序后的结果集,这将使用sort_area_size内存。该内存的优化也是非常重要的。下面可以使用SQL查询排序的消费:
低效率:
复制代码代码如下所示:
选择acct_num,balance_amt
从debit_transactions
在tran_date = '31-dec-95
联盟
选择acct_num,balance_amt
从debit_transactions
在tran_date = '31-dec-95

效率高:
复制代码代码如下所示:
选择acct_num,balance_amt
从debit_transactions
在tran_date = '31-dec-95
联盟的所有
选择acct_num,balance_amt
从debit_transactions
在tran_date = '31-dec-95

(29)用订单替换订单:
BY子句仅在两个严格条件下使用索引。
按顺序排列的所有列必须包含在同一索引中,并保持索引中的顺序。
按顺序排列的所有列必须定义为非空。
WHERE子句中使用的索引和BY子句中使用的索引不能并列。
例如,表部门包含以下列:
复制代码代码如下所示:
dept_code PK不空
dept_desc不空
dept_type空

低效:(不使用索引)
选择dept_type部门订单dept_code
效率:(使用索引)
选择dept_code的部门dept_type > 0
(30)避免更改索引列的类型:
当比较不同数据类型的数据,Oracle自动执行一个简单的类型转换到列。假设EMPNO是一个数值型指标栏:选择…从EMP在EMPNO =‘123'。事实上,Oracle类型转换后,声明转换为:选择从哪里empno = to_number EMP…('123)。
幸运的是,类型转换不会对索引列时,对该指标的使用没有改变。现在,假设emp_type是一个字符型的索引列:从EMP在emp_type = 123选择。
这一声明转换为:通过oracle.from EMP whereto_number选择(emp_type)= 123.because这种类型的索引将不会被使用因为发生内部的转型,为了避免你的SQL Oracle隐式转换,它是更好的显示类型转换明确。注意,当字符和数值进行比较,Oracle将优先为字符类型的数字类型转换。
(31)需要谨慎的WHERE子句:
某些SELECT语句中的WHERE子句不使用索引:
(1)=将不会使用索引。记住,索引只能告诉您表中的内容,但不能告诉您表中不存在的内容。
(2)是性格| |连接功能。像任何其他函数一样,该指数是废弃的。
(3)+是一个数学函数,与其他数学函数一样,索引也停止了。
(4)同一索引列不能相互比较,这将启用全表扫描。
(32)如果A检索表中的记录数超过30%的数据,将有在使用索引的效率没有明显改善。在特定情况下,使用索引可能比全表扫描速度较慢,但这是在同一个数量级的差异,一般情况下,指数几倍或数千倍以上的全表扫描。
(33)避免使用资源消耗的操作:
SQL语句不同,工会、减、相交,以将启动SQL引擎进行排序(排序)的resource.distinct功能需要排序操作,而其他人至少需要进行两类。通常,使用联合,减号,SQL的交叉语句可以用其他方式使用。如果你重写数据库部署sort_area_size,使用联盟、减、相交也可以考虑,毕竟,他们的可读性强。
(34)分组优化:
为了通过语句提高组的效率,可以在组之前过滤掉不需要的记录。
低效率:
复制代码代码如下所示:
选择作业,平均值(萨尔)
从EMP
工作组
有工作= 'president
或工作= 'manager

效率高:
复制代码代码如下所示:
选择作业,平均值(萨尔)
从EMP
当工作= 'president
或工作= 'manager
工作组
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部