SQL Server SQL语句调优技巧综合教程(精选3篇)由网友“屠豆Z璇”投稿提供,下面是小编给大家带来的SQL Server SQL语句调优技巧综合教程,以供大家参考,我们一起来看看吧!
篇1:SQL Server SQL语句调优技巧综合教程
通过例子和解析计划,本文展示了在Microsoft SQL Server上提高查询效率有效的一些技巧,在编程中有很多小提示和技巧。了解这些技巧可以扩展你在性能优化上的可用机能。
在这部分里我们所有的例子都选择使用Microsoft SHOWPLAN_ALL输出,因为它更紧凑并且展示典型的信息。(Sybase的查询计划基本与此相同,可能包含其它一些信息)大部分的例子都是要么基于PUBS数据库,要么基于标准系统表的。我们在PUBS数据库中对用到的表进行了很大扩充,对很多表增加了好几万行。
子查询优化
一条好的值得称赞的规则是尽量用连接代替所有的子查询。优化器有时可以自动将子查询“扁平化”,并且用常规或外连接代替。但那样也不总是有效。明确的连接对选择表的顺序和找到最可能的计划给出了更多的选项。当你优化一个特殊查询时,了解一下是否去掉自查询可产生很大的差异。
示例
下面查询选择了pubs数据库中所有表的名字,以及每个表的聚集索引(如果存在)。如果没有聚集索引,表名仍然显示在列表中,在聚集索引列中显示为虚线。两个查询返回同样的结果集,但第一个使用了一个子查询,而第二个使用一个外连接时。比较Microsoft SQL Server产生的查询计划:
不必更深探索,我们可以看到在CPU和总的实耗时间方面连接更快,仅需要子查询方案逻辑读的一半。此外,这两种情况伴随着相同的结果集,虽然排序的顺序不同,这是因为连接查询(由于它的GROUP BY子句)有一个隐含的ORDER BY:
查看这个子查询方法展示的查询计划:
反之,求和查询操作我们可以得到:
使用连接是更有效的方案。它不需要额外的流聚合(stream aggregate),即子查询所需在big_sales.qty列的求和。
UNION vs UNION ALL
无论何时尽可能用UNION ALL 代替UNION。其中的差异是因为UNION有排除重复行并且对结果进行排序的副作用,而UNION ALL不会做这些工作。选择无重复行的结果需要建立临时工作表,用它排序所有行并且在输出之前排序。(在一个select distinct 查询中显示查询计划将发现存在一个流聚合,消耗百分之三十多的资源处理查询)。当你确切知道你得需要时,可以使用UNION。但如果你估计在结果集中没有重复的行,就使用UNION ALL吧。它只是从一个表或一个连接中选择,然后从另一个表中选择,附加在第一条结果集的底部。UNION ALL不需要工作表和排序(除非其它条件引起的)。在大部分情况下UNION ALL更具效率。一个有潜在危险的问题是使用UNION会在数据库中产生巨大的泛滥的临时工作表。如果你期望从UNION查询中获得大量的结果集时,这就可能发生。
示例
下面的查询是选择pubs数据库中的表sales的所有商店的ID,也选择表big_sales中的所有商店的ID,这个表中我们加入了70,000多行数据。在这两个方案间不同之处仅仅是UNION 与UNION ALL的使用比较。但在这个计划中加入ALL关键字产生了三大不同。第一个方案中,在返回结果集给客户端之前需要流聚合并且排序结果。第二个查询更有效率,特别是对大表。在这个例子中两个查询返回同样的结果集,虽然顺序不同。在我们的测试中有两个临时表。你的结果可能会
关 键 字:SQLServer
篇2:教你轻松学会SQL Server记录轮班的技巧综合教程
例:公司员工采取三个轮班制度:凌晨0:00到早上8:00为第一班,早上8:00到下午4:00为第二班,下午4:00到晚上12:00为第三班,
员工使用电子时钟进行签名,这种电子签名可以自动将记录添加到SQL Server数据库中。但是,有时候,需要增加一个夜班;即使这个轮班发生在第二天,它仍然会被认为是第三班。
你也许希望根据轮班对记录进行分组,但是在你的计划中会有两个非常令人头痛的问题:
(1)不是所有的雇员都是按时到达的;
(2)有时候员工工作的时间会比他们的一个轮班的时间长一些。
为了能在你的列表中得到正确的分组,你必须假设所有的员工能在一个轮班的开始和结束时间之间的任意时间开始工作。
使用CASE语句是一种解决办法。Listing A中的SQL语句告诉我们,在创建测试表没有错误的情况下,它是如何工作的。
为了使程序代码完全准确的运行,你需要在时间的小窗口中得到每一个轮班的开始时间和下一个轮班的结束时间。在刚才的例子中,你可以用'15:59:59.123'这个值代替@StartTime,然后再重新运行代码。这时候,你必须在每一个轮班结束的分界点上增加999毫秒。
解决方案
这个例子假设轮班时间从来没有改变过,但是如果改变了轮班时间该怎么办呢?你必须仿照这个例子并根据改变了的时间写出所有的代码。
一个更好一点的主意就是,针对我们的轮班创建一个表来调用Shifts的开始时间和结束时间,
在这个表中,你可以修改Case语句来查找StopTime列。
Listing B中包含了创建Shifts表并向该表中增加记录的代码。代码在一个轮班中设置了时间后,这样使代码看上去既简单又灵活:
DECLARE @StartTime VARCHAR(20)
SET @StartTime ='22:59:59'
SELECTTOP 1 ShiftName FROM ShiftWork.Shifts
WHERE Shifts.StartTime <= @StartTime
ORDERBY StartTime DESC
我之所以要将轮班记录进行降序排列,是为了避免第三个轮班的边界问题。我将用一些测试案例来论证我的结论,这些内容你可以在Listing C中看到。
实际上,你可以将这个逻辑应用到TemeCards表的记录中去,而不需要创建另外的表,也就不需要在表中增加数据了。我同样使用一个简单的变量来论证我的逻辑。
关 键 字:SQLServer
篇3:语篇分析法在全新版《大学英语综合教程》教学中的应用
语篇分析法在全新版《大学英语综合教程》教学中的应用
语言存在于语篇之中,而不是句子之中.在全新版<大学英语综合教程>的教学过程中,分析语篇相关知识具有重要意义.文章简要介绍了语篇分析的相关知识,并以<综合教程>第一册的前五单元为例,就教学过程中如何运用语篇分析相关知识开展教学提出了几点想法:采取自上而下的'阅读模式;分析语篇模式,根据不同体裁的写作模式与特点进行教学;利用课文语境,引导学生注意语篇衔接与连贯的实现;介绍语篇文化背景知识,培养学生跨文化交际意识.
作 者:钱敏 QIAN Min 作者单位:浙江中医药大学外国语学院,浙江杭州,312300 刊 名:成都大学学报(教育科学版) 英文刊名:JOURNAL OF CHENGDU UNIVERSITY(EDUCATIONAL SCIENCES EDITION) 年,卷(期):2008 22(2) 分类号:H319.3 关键词:语篇 语篇分析 《大学英语综合教程》 阅读 写作 跨文化交际★ 调优日志切换(Tuning Log Switches)数据库教程
★ 存储过程实现分页
★ 数据库管理简历
★ 年终总结程序员
★ 程序员年终总结
【SQL Server SQL语句调优技巧综合教程(精选3篇)】相关文章:
程序员年终总结怎么写2022-11-08
平台架构师的职责表述2023-06-20
关于数据库解析不使用的五个理由2023-07-07
PHP高级开发工程师的基本职责说明2022-05-06
NET架构师岗位的工作职责2022-10-30
数据库工程师的工作职责2022-11-11
数据库工程师工作的职责2023-03-16
php开发主管的职责说明2023-07-21
学语言的方法2023-06-25
PHP中级开发工程师岗位的基本职责说明2022-05-08