SQL Server多表
查询的
优化方案是本文的主要内容。本文给出了优化方案和具体优化实例。接下来,让我们一起来
学习这个部分。
1。
执行路径 oracle的
功能极大地提高了sql的执行
性能,节省了
内存的使用。我们
发现单表数据的统计是多表统计的两个概念。单表统计可能只需要0.02秒,但是2个表合并了统计数据。
可能几秒钟。这是因为Oracle只对简单表缓存(缓存缓冲),这个
函数不适合
连接多表查询。数据库
管理员必须为该地区在init.ora中
设置相应
参数,当记忆面积较大,可以保留更多的语句,当然可能是共享的也越大。
2。选择最有效的表名称
顺序(后面少记录)
Oracle解析器按照从左到右的顺序,在from子句中的from子句中包含一个表,因此在表的结尾(基于表驱动表)将首先
处理。在from子句包含多个表时,必须选择记录数,至少以表为基础。当一个以上的表Oracle处理时,它们将使用连接
排序和合并
方法。首先,扫描第一个表(在最后一条语句的from子句中)和记录发送顺序,然后扫描第二个表(from子句中最后的第二个表),最后从记录中的第二个表中检索并在适当的记录中合并第一个表。
例如:
表16384记录表
表1对记录
选择TAB2作为基表(最好的方法)
select count(*)从表,对执行时间0.96秒
选择TAB2作为基表(差法)
Select count (*) from TAB2, tab1 execution time 26.09 seconds
如果有超过3个表连接查询,我们需要选择交叉表(交集表)作为基表,而交叉表是指其他表引用的表。
例如,EMP表描述的
位置表和catery表的交集。
*选择
从位置L,
catery C,
EMP E
在1000和2000之间的e.emp_no
和e.cat_no = c.cat_no
和e.locn = l.locn
它比下面的SQL更有效
*选择
来自EMP E,
位置L,
catery C
在e.cat_no = c.cat_no
和e.locn = l.locn
1000和2000之间e.emp_no
在3.where从句的连接顺序(
条件是以后)
Oracle使用自底向上序列解析WHERE子句。根据这个原则,表之间的连接必须写在其他条件之前。可以筛选出最多记录数的条件必须写在WHERE子句的结尾处。
例如:
(效率低下,执行时间为156.3秒)
选择…
从EMP E
萨尔50000
工作=经理
和25 <(从EMP中选择计数(*)
在MGR = e.empno);
(效率高,执行时间10.6秒)
选择…
从EMP E
其中25 <从EMP中选择计数(*)
在MGR = e.empno)
萨尔50000
工作=经理;
使用4.select条款避免*
当您想列出SELECT子句中的所有列时,使用动态SQL列引用*是一种方便的方法。不幸的是,这是一种非常低效的方式。事实上,Oracle在解析过程中,将*
转换为所有的名称,这是通过查询数据字典来完成的,这意味着将花费更多的时间。
5。减少访问数据库的次数
在执行每个SQL语句时,Oracle在内部执行许多
任务:解析SQL语句、估算索引利用率、绑定变量、读取数据块等。可以看出,减少访问数据库的数量实际上可以减少Oracle的工作量。
方法1(低效率)
选择emp_name,工资等级
从EMP
在emp_no = 342;
选择emp_name,工资等级
从EMP
在emp_no = 291;
方法2(高效率)
选择a.emp_name,A.SALARY,a.grade,
b.emp_name,B.SALARY,b.grade
来自EMP A,EMP B
在a.emp_no = 342
和b.emp_no = 291;
6。
删除重复记录
删除重复记录的最有效的方法(因为数据使用)
删除EMP
在e.rowid >(选择min(x.rowid))
从EMP X
在x.emp_no = e.emp_no);
7。而不是用截断删除
当删除表中的记录,在一般
情况下,回滚段(回滚段)是用于存储的信息可以
恢复。如果您没有提交事务,Oracle将在执行删除
命令状态之前,将数据删除回状态(在执行删除命令状态之前进行精确恢复),以及使用截断时。没有回滚存储,任何信息都可以恢复。当命令
运行时,数据无法恢复。很少有资源被调用,执行时间将非常短。
8。尽可能多地使用提交
尽可能长地在
程序中尽可能多地使用提交,从而提高程序的性能,并减少由于提交所释放的资源而降低的需求:
提交资源:
用于在回滚段上恢复数据的信息。
由程序语句获得的锁。
重做日志缓冲区
Oracle为内部管理的3个资源成本(完整性,当使用提交必须注意交易效率和现实的交易往往是不能有鱼和熊掌)
9。减少对表的查询
在SQL语句中包含子查询,特别要注意减少表的查询。
例如:
低效率:
选择tab_name
从表
在tab_name =(选择tab_name)
从tab_columns
版本= 604)
和db_ver =(选择db_ver)
从tab_columns
版本= 604
效率高:
选择tab_name
从表
在(tab_name,db_ver)
=(选择tab_name,db_ver)
从tab_columns
版本= 604)
更新多个列示例:
低效率:
更新EMP
集emp_cat =(选择最大(catery)从emp_cateries),
sal_range =(选择最大(sal_range)从emp_cateries)
在emp_dept = 0020;
效率高:
更新EMP
集(emp_cat,sal_range)
=(选择最大(catery),最大(sal_range))
从emp_cateries)
在emp_dept = 0020;
10。以存在
替换,而不是存在而不是不存在。
在基于基本表的许多查询中,为了满足一个条件,常常需要加入另一个表。在这种情况下,使用存在(或不存在)通常会提高查询的效率。
低效率:
*选择
来自EMP(基表)
在EMPNO > 0
和部门在(SELECT DEPTNO)
从系
在LOC =
公司 效率高:
*选择
来自EMP(基表)
在EMPNO > 0
存在(选择x)
从系
在dept.deptno = emp.deptno
和LOC =公司
(相反,不使用不存在替换则会更有效地
提高效率)
在子查询中,没有条款将执行一个内部排序和合并。在两种情况下,不是最低效的(因为它在查询表中执行一个完整的表扫描)。为了避免使用不在,我们可以重写成连接(外部连接或不存在)。
例如:
选择…
从EMP
在dept_no没有(选择dept_no)
从系
在dept_cat =);
为了提高效率,重写为:
(方法1:高效率)
选择了…
来自EMP A,B部
在a.dept_no =十堰(+)
和b.dept_no是空的
和b.dept_cat(+)= A
(方法二:最有效)
选择了…
从EMP E
在不存在(select'x)
从部门D
在d.dept_no = e.dept_no
和dept_cat = A);
当然,效率最高的方法是表相关。直接两表关系对联的
速度最快!
11。低效执行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倒序;
(尽管目前有各种用于SQL优化的图形化工具,但编写
解决问题的SQL工具始终是最好的方法。)
以上是SQL Server多表查询优化程序的相关知识,希望对您的
介绍有所帮助!