编写SQL需要注意的细节Checklist概括
发布时间:2021-11-29 13:42:23 所属栏目:教程 来源:互联网
导读:复制代码 代码如下: /* --注意:准备数据(可略过,非常耗时) CREATE TABLE CHECK1_T1 ( ID INT, C1 CHAR(8000) ) CREATE TABLE CHECK1_T2 ( ID INT, C1 CHAR(8000) ) DECLARE @I INT SET @I=1 WHILE @I=10000 BEGIN INSERT INTO CHECK1_T1 SELECT @I,C1 IN
--而第二种则将缓存计划浪费了,导致缓存很快被占满,这种做法是相当不可取的 --===================================== --7、 Left Join 的替代法 --测试一 执行计划:表扫描 -> 哈希匹配 SELECT A.ID,A.C1 FROM CHECK3_T1 A --2W行 LEFT JOIN CHECK3_T2 B ON A.ID=B.ID WHERE B.C1='C1' --400行 --测试二 执行计划:表扫描 -> 哈希匹配 SELECT A.ID,A.C1 FROM CHECK3_T1 A RIGHT JOIN CHECK3_T2 B ON A.ID=B.ID WHERE a.C1='C1' --测试三 执行计划:表扫描 -> 哈希匹配 SELECT A.ID,A.C1 FROM CHECK3_T1 A INNER JOIN CHECK3_T2 B ON A.ID=B.ID WHERE B.C1='C1' --总结:三条语句,在执行计划上完全一样,都是走的INNER JOIN的计划, --因为测试一和测试二中,WHERE语句都包含了LEFT 和RIGHT表的字段,SQLSERVER若发现只要有这个表的字段,则会自动按照INNER JOIN进行处理 --补充测试:(1s)执行计划:表扫描-> 并行度 -> 位图 -> 排序 -> 合并联接 -> 并行度 SELECT A.ID,A.C1 FROM CHECK3_T2 A --400行 INNER JOIN CHECK3_T1 B ON A.ID=B.ID WHERE A.C1='C1' --2W行 --总结:这里有一个比较有趣的地方,若主表和关联表数据差别很大时,走的执行计划走的另一条路 --===================================== --8、 ON(a.id=b.id AND a.tag=3) --测试一 SELECT A.ID,A.C1 FROM CHECK3_T1 A INNER JOIN CHECK3_T2 B ON A.ID=B.ID AND A.C1='C1' --测试二 SELECT A.ID,A.C1 FROM CHECK3_T1 A INNER JOIN CHECK3_T2 B ON A.ID=B.ID WHERE A.C1='C1' --总结:内连接:无论是左表和右表的筛选条件都可以放到WHERE子句中 --测试一 SELECT A.ID,A.C1,B.C1 FROM CHECK3_T1 A LEFT JOIN CHECK3_T2 B ON A.ID=B.ID AND B.C1='C1' --测试二 SELECT A.ID,A.C1,B.C1 FROM CHECK3_T1 A LEFT JOIN CHECK3_T2 B ON A.ID=B.ID WHERE B.C1='C1' --总结:左外连接:当右表中的过滤条件放入ON子句后和WHERE子句后的结果不一样 --===================================== --9、 赋值给变量,加Top 1 --测试一:(3s) 执行计划:表扫描 DECLARE @ID INT SELECT @ID=ID FROM CHECK1_T1 WHERE C1='C1' SELECT @ID --测试二:(0s)执行计划:表扫描-> 前几行 DECLARE @ID INT SELECT TOP 1 @ID=ID FROM CHECK1_T1 WHERE C1='C1' SELECT @ID --总结:给变量赋值最好都加上TOP 1,一从查询效率上增强,二为了准确性,若表CHECK1_T1有多个值,则会取最后一条记录赋给@ID --===================================== --10、 考虑是否适合用CASE语句 DECLARE @S INT=1 SELECT * FROM CHECK5_T1 WHERE C1=(CASE @S WHEN 1 THEN C1 ELSE 'C2' END) SELECT * FROM CHECK5_T1 WHERE @S=1 OR C1='C2' /*--===================================== 、检查语句是否需要Distinct. 执行计划:表扫描-> 哈希匹配-> 并行度-> 排序 select distinct c1 from CHECK3_T1 、禁用Select *,指定具体列名 select c1 from CHECK4_T1 select * from CHECK4_T1 、Insert into Table(*),指定具体的列名 、Isnull,没有必要的时候不要对字段使用isnull,同样会产生无法有效利用索引的问题, 和避免在筛选列上使用函数同样的原理。 、嵌套子查询,加上查询条件,确保子查询的结果集最小 --=====================================*/ ![]() (编辑:宿州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐