SQL语句在SQLServer中的优化与效率
很多人不知道SQL语句是如何在SQL Server中执行的,他们担心SQL语句会被SQL Server误解:SELECT * FROM表name = 'zhangsan'and TID > 10000
与实现:
SELECT * FROM表1,tid > 10000名= 'zhangsan
有些人不知道两个以上语句的执行效率是一样的,因为如果一个简单的声明已经从的角度来看,这两种说法都不一样,如果tid是聚合索引,然后简单地看从10000在短短一句话记录后;从全面查找表开始看到几个名字= 'zhangsan ',然后根据TID > 10000条件提出了限制搜索结果。
事实上,这种担心是不必要的,在SQL Server中有一个查询分析优化器,它可以计算WHERE子句中的搜索条件,并确定哪些索引可以减少表扫描的扫描空间,也就是说,它可以实现自动优化。
尽管查询优化器可以根据WHERE子句自动查询优化,但仍然需要了解查询优化器的工作原理。如果没有,有时查询优化器不会根据您的初衷快速查询。
在查询分析阶段,查询优化器看起来在查询每个阶段和确定它是否是限制需要扫描的数据量有用。如果一个阶段可以作为扫描参数(SARG),则称optimable,和所需的数据可以快速通过获得指数。
对特区政府的定义是一个操作,限制了搜索,因为它通常是指某一场比赛,在一个值得范围内的匹配,两个或两个以上条件和连接形式如下:
列名操作符
或
运算符列名可以出现在运算符的一侧,常量或变量出现在运算符的另一侧:
名称=
价格> 5000
5000 <<价格
名称=以及价格> 5000
如果表达式不满足SARG形式,它不能限制搜索范围。也就是说,SQL Server必须判断每一个条件的每一行是否满足所有条件的WHERE子句中,索引的不满足SARG形式表达是无用的。
对特区政府出台后,我们将总结使用SARG和在实践中遇到的部分数据得出不同结论的经验:
1、是否喜欢声明属于SARG取决于通配符的使用类型
-如:
Name like '- Zhang%. 这属于蒲。
- and:
叫喜欢,不属于蒲。
原因是通配符%对字符串开放,因此索引不能被使用。
2,或将导致全表扫描
名称=以及价格> 5000标志和名称= 'zhang蒲,三或价格> 5000不符合特区政府使用或将导致全表扫描。
三.财务报表不满意的非操作符和函数引起的SARG形式
不满足SARG语句,包括非运营报表,如最典型的形式:不,!=,< >,不存在,不存在!,不喜欢,除了功能。这里是一些例子,不符合SARG形式:
ABS(价格)< 5000
名字像三
-一些表达式,如:
价格* 2比5000
SQL Server也会认为这是特区政府,SQL Server将转换为:
价格> > 2500 2
但我们不推荐使用这种方法,因为有时SQLServer不保证这种转换完全等同于原始表达式。
4,作用在相当于或
句uff1a
SELECT * FROM表1,tid(2,3)
-
SELECT * FROM表1,tid = 2或tid = 3
同样会引起全表扫描,如果有一个在TID索引,索引也会失败。
5。尽量少用
执行效率为6,存在且在同一。
大量的信息表明存在比更有效,应该使用不存在而不是尽可能多的。但事实上,我试图找到这两种效率两和两者之间的相同。因为子查询,我们尝试与pubs数据库,带来了SQL服务器,运行前,我们可以打开统计我/ SQL Server的状态:
(1)
选择标题,从标题里title_id价格(选择title_id销售)
这句话的结果如下:
table'sales。扫描计数18,逻辑读取56次,物理读0次,0次吧。
table'titles。扫描计数1,逻辑读取2次,物理读0次,0次吧。
(2)
从标题中选择标题、价格
存在(从销售中选择*)
那里的销售。title_id = titles.title_id和数量> 30)
第二句的结果如下:
table'sales。扫描计数18,逻辑读取56次,物理读0次,0次吧。
table'titles。扫描计数1,逻辑读取2次,物理读0次,0次吧。
我们可以看到相同的执行效率。
7。函数charindex()是为喜欢执行效率的通配符%之前一样
早些时候,我们谈论的事实,如果通配符%添加到前面一样,全表扫描会造成的,所以它的执行效率是很低的。但一些数据表明该函数charindex速度()而不是像速度将大大提高。
选择GID,标题,fariqi,读者从tgongwen
其中charindex(犯罪侦查支队,读者)> 0和fariqi > '2004-5-5
时间:7秒,另外:扫描计数4次,逻辑读7155次,物理读0次,提前0次。
选择GID,标题,fariqi,读者从tgongwen
在读者喜欢%++和fariqi > '2004-5-5刑事侦查支队
时间:7秒,另外:扫描计数4次,逻辑读7155次,物理读0次,提前0次。
8,工会不是绝对有效的。
正如我们前面提到过的,WHERE子句中的使用或将导致全表扫描。一般来说,我所推荐的数据是用工会取代工会的,这证明了这一声明适用于大多数工会。
选择GID,fariqi,neibuyonghu,读者,标题来自Tgongwen
在fariqi = '2004-9-16'or GID > 9990000
时间:68秒。扫描计数1,逻辑读404008次,物理读283次,前392163次。
选择GID,fariqi,neibuyonghu,读者,从Tgongwen那里fariqi = '2004-9-16称号
联盟
选择GID,fariqi,neibuyonghu,读者从Tgongwen那里GID > 9990000题
时间:9秒。扫描计数8,逻辑读67489次,物理读216次,前7499次。
似乎使用工会比使用或在通常情况下效率更高。
但经过测试,笔者发现,如果查询双方的列或是相同的,那么执行速度的联合就差得多了。虽然联合扫描是索引,或者扫描是满表。
选择GID,fariqi,neibuyonghu,读者,标题来自Tgongwen
在fariqi = '2004-9-16'or fariqi = '2004-2-5
时间:6423毫秒。扫描计数2次,逻辑读14726次,物理读1次,前7176次。
选择GID,fariqi,neibuyonghu,读者,从Tgongwen那里fariqi = '2004-9-16称号
联盟
选择GID,fariqi,neibuyonghu,读者,从Tgongwen那里fariqi = '2004-2-5称号
时间:11640毫秒。扫描计数8次,逻辑读14806次,物理读108次,前1144次。
9,字段提取应该基于多少和避免选择的原则。
让我们做一个实验。
选择前10000 GID,fariqi,读者,从tgongwen为GID DESC标题
使用时间:4673毫秒
选择前10000 GID,fariqi,从tgongwen为GID DESC标题
使用时间:1376毫秒
选择前10000 GID,fariqi从tgongwen为GID desc
使用时间:80毫秒
因此,每一个小字段都被提取出来,数据抽取的速度也会相应提高,提升的速度取决于你放弃的字段的大小。
10,计数(*)不会比计数(字段)慢。
在某些数据中,所有列的统计数字显然比世界名称的效率低:
select count(*)Tgongwen
使用时间:1500毫秒
select count(GID)Tgongwen
使用时间:1483毫秒
select count(fariqi)Tgongwen
使用时间:3140毫秒
select count(标题)Tgongwen
使用时间:52050毫秒
从上面,我们可以看到,如果我们使用计数(*)和计数(主键),速度是非常相似的,当数(*)的速度比任何其他领域除主键外,现场和较长,较慢的聚集。我认为如果计数(*)使用SQL Server可以自动找到最小字段收集它。当然,如果你写的直接计算(主键),它会来的更直接。
11,顺序通过聚合索引列对最高效率进行排序
让我们来看看:(GID是主要的关键,fariqi是聚集索引列):
选择前10000 GID,fariqi,读者,标题从tgongwen
时间:196毫秒。扫描计数1次,逻辑读289次,物理读1次,前1527次。
选择前10000 GID,fariqi,读者,从tgongwen为GID ASC标题
时间:4720毫秒。扫描计数1次,逻辑读41956次,物理读0次,前1287次。
选择前10000 GID,fariqi,读者,从tgongwen为GID DESC标题
时间:4736毫秒。扫描计数1次,逻辑读55350次,物理读10次,前775次。
选择前10000 GID,fariqi,读者,从tgongwen顺序fariqi ASC标题
时间:173毫秒。扫描计数1次,逻辑读290次,物理读0次,前0次。
选择前10000 GID,fariqi,读者,从tgongwen顺序fariqi DESC标题
时间:156毫秒。扫描计数1次,逻辑读289次,物理读0次,前0次。
从上面我们可以看出排序的速度和逻辑读取的数量与聚集索引列的顺序相当,但是这些速度比非聚集索引列的快得多。
同时,根据某个字段排序时间,无论它是正的还是反转的,速度是非常基本的。
12。高效的顶
事实上,在查询和提取大容量数据集时,影响数据库响应时间的最大因素不是数据搜索,而是物理i/0操作:
选择顶部10 *从(
选择前10000 GID,fariqi,标题从tgongwen
在neibuyonghu = 'office
通过GID倒序)作为
GID ASC的秩序
这种说法,在理论上,使整个语句的执行时间应该比该条款的执行时间较长,但事实是相反的。因为,在条款的执行,返回10000条记录,而只有10的陈述是回到整个句子,所以影响数据库的响应时间是最重要的因素是物理我 / O操作。一个限制物理我/ O操作的最有效的方法是使用热门关键词,热门关键词是系统在SQL Server优化提取数据前几或百分之几。笔者在实践中的应用后,发现上面是非常有效的,但是这句话是不是在另一个大型数据库Oracle发现,C一个不能说不是一种遗憾,但它可以通过其他方法解决的问题(如rownumber)在Oracle的分页过程实现对水平的数据数千万千万未来的讨论,我们将用最高的关键词。
到目前为止,我们已经讨论过如何快速地从大容量数据库中查询所需的数据方法。在实际应用中,必须考虑各种硬因素,如网络性能、服务器性能、操作系统性能、网卡、交换机等。