oracle查询优化的基本准则详解
2:当两个表关联时,我们应该考虑使用正确连接的可能性,以提高查询速度。
3:使用位置而不是拥有,用于过滤行,并用于过滤组,因为可以将行组过滤后分组,因此尽可能地过滤用户。
4:使用代替存在,因为存在只检查一行的存在,并检查实际值。
5:运算符中
SQL语言的优点是易于编写、清晰易懂,适用于现代软件开发风格。
但是SQL在内部的性能总是很低,因为:
sql语句总是试图将它转换成多个表,如果转换不成功,则首先执行内插。
子查询中,然后该表记录的外层
如果转换成功,则连接被转换为多个表。
进程。一般SQL可以转换为成功。
但是对于包含数据包统计数据的SQL,它不能被转换。因此,在业务密集型SQL中,尽可能不使用内运算符。
6:不在操作员中
强烈建议不要使用它,因为它不能应用表的索引。
在这种情况下,应该替换为存在、不存在或(外部连接+判断)。
7:<运算符
它不等于操作符从不使用索引,因此它的处理只会产生全表扫描。
在这种情况下,可以用其他方式替换,例如:
> 0 - > > 0或<0
>>
8类算子
SQL语句需要过滤完全取代设备的处理速度将大大提高。
9:联合运营商
在连接表之后,联合会过滤掉重复的记录,因此结果将在表链接链接后得到结果集。
删除重复记录并返回结果。在大多数实际应用中,不生成重复记录,最常见的是进程表和历史记录。
表联合,例如:
复制代码代码如下所示:
SELECT * FROM gc_dfys
联盟
SELECT * FROM ls_jg_dfys
此SQL在运行时取出两个表的结果,然后用排序空间对重复记录进行排序,最后返回结果集。
如果表中的数据量很大,则可能导致使用磁盘进行排序。
建议:使用联合所有运算符代替工会,因为在合并两个结果后,联合操作全部返回。
复制代码代码如下所示:
SELECT * FROM gc_dfys
联盟的所有
SELECT * FROM ls_jg_dfys
10个sql写作的影响
同一函数对sql性能的影响
例如由程序员编写的sql
SELECT * FROM zl_yhjbqk
程序员写
SELECT * FROM dlyx.zl_yhjbqk(与表所有者的前缀)
C程序员写的
SELECT * FROM dlyx.zlyhjbqk(大写的名字)
D程序员写
SELECT * FROM dlyx.zlyhjbqk(中更多的空间)
上述四个SQL的结果与Oracle分析之后的执行时间相同,但SGA是从Oracle共享的。
原理,
可以得出结论,Oracle将对每个SQL进行分析并获取共享内存,如果SQL的字符串和格式被写入。
同样,Oracle只会分析它一次,
共享内存将只留下一个分析结果,它不仅可以减少SQL分析的时间,而且可以减少共享内存的重复。
信息方面,oracle还可以准确计算SQL执行的次数。
11后面条件的影响:在哪里
WHERE子句后面的条件顺序对大数据量的查询有直接影响,如
复制代码代码如下所示:
SELECT * FROM zl_yhjbqk哪里dy_dj = '1kv下面和xh_bz = 1
SELECT * FROM zl_yhjbqk哪里xh_bz = 1和dy_dj =下面'1kv。
dy_dj超过两SQL(电压)和xh_bz(取消标记)两个字段没有索引,所以执行时间
它是全表扫描,
第一个SQL dy_dj =低于'1kv的条件99%在记录集和xh_bz = 1的比例仅为0.5%。
在第一个SQL的时候,99%的记录相比,dy_dj和xh_bz,而0.5%的记录被记录在第二SQL进行。
两dy_dj和xh_bz相比。
可以得出结论,第二SQL的CPU占用率显著低于第一SQL。
12的影响:表顺序
表后面的列表顺序影响SQL的性能,Oracle表中没有表的索引和统计分析。
在这种情况下,Oracle将按照表出现的顺序进行链接。
这是因为表的顺序不会产生非常耗费服务器资源的数据交叉,
oracle将自动链接高级的小表,然后链接大表。)
13:函数处理字段不利用索引,如:
复制代码代码如下所示:
substr(hbs_bh,1,4)= '5400,优化处理:hbs_bh像' 5400% '
trunc(sk_rq)= trunc(SYSDATE),优化处理:
sk_rq > = trunc(SYSDATE)和sk_rq < trunc(SYSDATE + 1)
执行显式或隐式操作的字段不能索引,如:
复制代码代码如下所示:
ss_df + 20 > 50,优化:ss_df > 30
X| | hbs_bh > 'x5400021452,优化:hbs_bh > '5400021542
sk_rq + 5 = SYSDATE,优化:sk_rq = sysdate-5
hbs_bh = 5401002554,优化:hbs_bh = '5401002554 ',注:这个条件是隐含在hbs_bh
to_number转换,因为hbs_bh字段是一个字符类型。
当包含多个表的字段操作时,不能对索引进行索引,例如:
ys_df > cx_df,不能优化
qc_bh | | kh_bh = '5400250000,优化:qc_bh = '5400和kh_bh = '250000
提示(提示符)处理为14:Oracle的应用
在对Oracle生成的SQL分析执行路径不满意的情况下,可以使用即时处理。
面对面暗示
目标提示:
成本(按成本优化)
规则(由规则优化)
选择(默认)(Oracle自动选择成本或规则优化)
选择emp_no,emp_nam,从哪里emp_no =斯科特dat_in bsempms;
all_rows(所有线路尽快返回)
选择emp_no,emp_nam,从哪里emp_no =斯科特dat_in bsempms;
first_rows(数据的第一行是尽快归还)
选择*
从xxx
其中xxx;
选择*
从xxx
其中xxx
优化器提示:它用于改进SQL语句的响应时间,并快速返回到n行。
提示访问路径
完整:执行满表扫描
甲状腺扫描:是通过rowid
索引:由索引扫描
SELECT * FROM EMP在表200和萨尔> 300;
如果超过一个被写入,Oracle自动选择哪一个是最优的。
SELECT * FROM EMP在表200和萨尔> 300;
index_join:如果选定的字段都是索引字段(几个指标),数据可以通过索引连接访问,而不需要访问数据。
表中的数据。
选择DEPTNO,萨尔从EMP
在表20;
index_ffs:执行快速全索引扫描
从EMP中选择计数(*);
no_index:指定的索引不使用
SELECT * FROM EMP在表200
萨尔300;
and_equal:指定一个组合的两个或两个以上的索引检索(交叉口),最多不超过5
执行方法的提示:
use_nl(使用嵌套循环模式)
USE_MERGE (using the MERGE join mode)
use_hash(使用哈希连接模式)
根据表从表中显示的顺序,该命令使Oracle按此顺序连接它。
例如:
选择a.col1,b.col2,c.col3从表一、表B,表3 C
在a.col1 = b.col1和b.col1 = c.col1;
将指定的表连接到嵌套连接的行源,并使用指定的表作为内部表。
例如:
选择bsdptms.dpt_no,bsempms.emp_no,bsempms.emp_nam
从bsempms,bsdptms bsempms dpt_no = bsdptms.dpt_no那里;
通过组合排序连接将指定表与其他行源连接起来。
例如:
SELECT * FROM bsempms,bsdptms
在bsempms dpt_no = bsdptms.dpt_no;
通过哈希连接将指定的表连接到其他行源。
例如:
SELECT * FROM bsempms,bsdptms
在bsempms dpt_no = bsdptms.dpt_no;
其他高级技巧(如并行处理等)
Oracle的提示是一个功能更强、应用更复杂的提示,提示只是Oracle的一个建议。
有时Oracle可能不会被成本考虑所驱使,根据实际应用,一般不建议开发人员应用Oracle提示。
由于每个数据库和服务器的性能不同,很可能本地性能有所改善,但另一个地方已经下降。
Oracle在SQL执行分析中比较成熟,如果分析执行的路径不是第一个,它应该在数据库结构中(主要是索引),
当前服务器的性能(共享内存、磁盘文件碎片)、数据库对象(表、索引)统计信息在这些方面的分析是正确的。