SQLServer多表查询优化方案

SQLServer多表查询优化方案
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多表查询优化程序的相关知识,希望对您的介绍有所帮助!
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部