资源描述:
《如何写出高效的sql脚本》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、如何写出高效的SQL脚本:如何写出高效的SQL脚本《二》1. 设计如何满足SARG形式的SQL脚本SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。[可以理解为索引扫描]形式如下:列名操作符<常数或变量>或<常数或变量>操作符列名列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:Name=’ATA’数量>50005000<数量Name=’ATA’and数量>5000如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQL
2、SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的2. LikeLike语句是否属于SARG取决于所使用的通配符的类型如:namelike‘ATA%’,这就属于SARG5.1-9,,services,andmakethecitymoreattractive,strengtheningpublictransportinvestment,establishedasthebackboneoftheurbanrailtransitmulti-level,multi
3、-functionalpublictransportsystem,thusprotectingtheregionalpositionandachieve而:namelike‘%ATA’,就不属于SARG。原因是通配符%在字符串的开头使得索引无法使用。3. OR 和 INor会引起全表扫描Name=’ATA’and数量>5000符号SARG,而:Name=’ATA’or数量>5000则不符合SARG。使用or和In会引起全表扫描4. 非操作符、函数引起的不满足SARG形式的语句不满足SARG形式的语句最典型的情况就是包括
4、非操作符的语句,如:NOT、!=、<>、!<、!>、NOTEXISTS、NOTIN、NOTLIKE,isnull,notnull等,另外还有函数。下面就是几个不满足SARG形式的例子:ABS(数量)<5000Namelike‘%ATA’有些表达式,如:WHERE数量*2>5000SQLSERVER也会认为是SARG,SQLSERVER会将此式转化为:WHERE数量>2500/2不推荐这样使用,因为有时SQLSERVER不能保证这种转化与原始表达式是完全等价的。5. 函数charindex()、前面加通配符%的LIKE,后面加%的效
5、率比较如果在LIKE前面加上通配符%,那么将会引起全表扫描,所以其执行效率是低下的。用函数charindex()来代替LIKE速度会有大的提升的说法不对的,测试如下:5.1-9,,services,andmakethecitymoreattractive,strengtheningpublictransportinvestment,establishedasthebackboneoftheurbanrailtransitmulti-level,multi-functionalpublictransportsystem,thusprotect
6、ingtheregionalpositionandachieve1. selectfcandidateid,fcandidatenamefromtcandidatewherefcandidatenamelike'Tim%'用时:36秒,记录结果数:200万2. selectfcandidateid,fcandidatenamefromtcandidatewhere charindex('Tim',fcandidatename)>0用时:47秒,记录结果数:200万3. selectfcandidateid,fcand
7、idatenamefromtcandidatewhere fcandidatenamelike'%Tim%'用时:45秒,记录结果数:200万通过以上3个例子可以看出,再使用Like的时候,后面加“Tim%”符合SARG规则,用时明显少于后两种,后两种的性能基本上差不多如果非的模糊,比如:substring(fcandidatename,1,1)=’A’,那么可以考虑这样:fcandidatenamelike‘A%’来代替(因为这样用的是索引扫描,不是表扫描)如何写出高效的SQL脚本《二》6. 字段提取要按照“需多少、提多少”的原
8、则,避免“select*“下面我来做一个测试:a) selectfcandidateid,fcandidatenamefromtcandidatewhere fcandi