- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何写出高效的SQL脚本如何写出高效的SQL脚本
如何写出高效的SQL脚本:如何写出高效的SQL脚本《二》
1.???????? 设计如何满足SARG形式的SQL脚本
SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。[可以理解为索引扫描]形式如下:
列名 操作符 常数 或 变量
或
常数 或 变量 操作符列名
列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:
Name=’ATA’
数量5000
5000数量
Name=’ATA’ and 数量5000
如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQL SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的
2.???????? Like
Like语句是否属于SARG取决于所使用的通配符的类型
如:name like ‘ATA%’ ,这就属于SARG
而:name like ‘%ATA’ ,就不属于SARG。
原因是通配符%在字符串的开头使得索引无法使用。
3.???????? OR 和 IN
or 会引起全表扫描
Name=’ATA’ and 数量5000 符号SARG,而:Name=’ATA’ or 数量5000 则不符合SARG。使用or和In会引起全表扫描
4.????? 非操作符、函数引起的不满足SARG形式的语句
不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、、!、!、NOT EXISTS、NOT IN、NOT LIKE,is null, not null等,另外还有函数。下面就是几个不满足SARG形式的例子:
ABS(数量)5000
Name like ‘%ATA’
有些表达式,如:
WHERE 数量*25000
SQL SERVER也会认为是SARG,SQL SERVER会将此式转化为:
WHERE数量2500/2
不推荐这样使用,因为有时SQL SERVER不能保证这种转化与原始表达式是完全等价的。
5.?????? 函数charindex()、前面加通配符%的LIKE,后面加%的效率比较
如果在LIKE前面加上通配符%,那么将会引起全表扫描,所以其执行效率是低下的。用函数charindex()来代替LIKE速度会有大的提升的说法不对的,测试如下:
1.????? select fcandidateid,fcandidatename from tcandidate where fcandidatename like Tim%
用时:36秒,记录结果数:200万
2.????? select fcandidateid,fcandidatename from tcandidate
where? charindex(Tim,fcandidatename)0
用时:47秒,记录结果数:200万
3.????? select fcandidateid,fcandidatename from tcandidate
where? fcandidatename like %Tim%
用时:45秒,记录结果数:200万
通过以上3个例子可以看出,再使用Like的时候,后面加“Tim%”符合SARG规则,用时明显少于后两种,后两种的性能基本上差不多
如果非的模糊,比如:substring(fcandidatename,1,1)=’A’,那么可以考虑这样:fcandidatename like ‘A%’来代替(因为这样用的是索引扫描,不是表扫描)
如何写出高效的SQL脚本《二》
6.?????? 字段提取要按照“需多少、提多少”的原则,避免“select *“
下面我来做一个测试:
a)????? select fcandidateid,fcandidatename from tcandidate where? fcandidatename like Tim%
用时:35秒 记录结果数:200万
b)????? select fcandidateid,fcandidatename,fCredentialsID,fbirthday from tcandidate where? fcandidatename like Tim%
用时:51秒记录结果数:200万
c)????? select fcandidateid from tcandidate where? fcandidatename like Tim%
用时:23秒 记录结果数:200万
由此看来,我们每少提取一个字段,数据的提取速度就会有相应的提升,当然提升的速度还要
文档评论(0)