率先个被实施的是from语句,领悟sql执行顺序

一:精通sql执行各样

一:通晓sql执行各样

       
在sql中,第三个被执行的是from语句,每2个步骤都会发出一个虚拟表,该表供下三个手续查询时调用,比如语句:select
top 10 column1,colum2,max(column3) from user where id>1 group by
column1,colum2 having
count(column1)>1 order by colum2.

       
在sql中,第②个被执行的是from语句,每3个步骤都会产生一个虚拟表,该表供下1个手续查询时调用,比如语句:select
top 10 column1,colum2,max(column3) from user where id>1 group by
column1,colum2 having
count(column1)>1 order by colum2.

      sqlserver 二零零五各样环节简单介绍:

      sqlserver 2006各样环节不难介绍:

(8)SELECT (9)DISTINCT  (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
(8)SELECT (9)DISTINCT  (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>

   a)各样步骤简介:

   a)种种步骤简介:

  1. FROM:对FROM子句中的四个表执行笛Carl积(Cartesian
    product)(交叉联接),生成虚拟表VT1
  2. ON:对VT1采用ON筛选器。只有那几个使<join_condition>为实在行才被插入VT2。
  3. OUTE揽胜极光(JOIN):如 果钦点了OUTE奥迪Q3JOIN(相对于CROSS JOIN 或(INNE冠道 JOIN),保留表(preserved
    table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把八个表都标记为保留表)中未找到匹配的就要作为外部行添加到
    VT2,生成VT3.假使FROM子句包罗五个以上的表,则对上三个接入生成的结果表和下1个表重复执行步骤1到步骤3,直各处理完全数的表停止。
  4. WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4.
  5. GROUP BY:按GROUP
    BY子句中的列列表对VT4中的行分组,生成VT5.
  6. CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.
  7. HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7.
  8. SELECT:处理SELECT列表,产生VT8.
  9. DISTINCT:将重新的行从VT第88中学移除,发生VT9.
  10. OLX570DE本田UR-V BY:将VT9中的行按OLX570DE昂科拉 BY
    子句中的列列表排序,生成游标(VC10).
  11. TOP:从VC10的起头处选拔内定数量或比重的行,生成表VT11,并赶回调用者.
  1. FROM:对FROM子句中的两个表执行笛Carl积(Cartesian
    product)(交叉联接),生成虚拟表VT1
  2. ON:对VT1用到ON筛选器。唯有那四个使<join_condition>为真正行才被插入VT2。
  3. OUTERubicon(JOIN):如 果钦点了OUTE福睿斯JOIN(相对于CROSS JOIN 或(INNE凯雷德 JOIN),保留表(preserved
    table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把四个表都标记为保留表)中未找到匹配的就要作为外部行添加到
    VT2,生成VT3.一旦FROM子句包蕴三个以上的表,则对上3个接通生成的结果表和下二个表重复执行步骤1到步骤3,直随地理完全体的表结束。
  4. WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4.
  5. GROUP BY:按GROUP
    BY子句中的列列表对VT4中的行分组,生成VT5.
  6. CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.
  7. HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7.
  8. SELECT:处理SELECT列表,产生VT8.
  9. DISTINCT:将重新的行从VT第88中学移除,发生VT9.
  10. OOdysseyDE帕杰罗 BY:将VT9中的行按O奥迪Q3DE奔驰M级 BY
    子句中的列列表排序,生成游标(VC10).
  11. TOP:从VC10的始发处选取钦点数量或比重的行,生成表VT11,并重回调用者.

 

 

  b)标准sql执行各类是:

  b)标准sql执行各样是:

  1:form 组装来自不一样表的数目,如 form user恐怕,form user as u join
goodsOrder as r on u.id= r.userid

  1:form 组装来自不一致表的多少,如 form user可能,form user as u join
goodsOrder as r on u.id= r.userid

  2:where 过滤符合查询条件的数目,如:id>一千

  2:where 过滤符合查询条件的多少,如:id>一千

  3:group by 将查询数据开始展览分组

  3:group by 将查询数据开始展览分组

  4:使用sum等聚合函数举办总括。

  4:使用sum等聚合函数进行总结。

  5:使用having 举办筛选分组。

  5:使用having 实行筛选分组。

  6:执行select语种

  6:执行select语种

  7:执行排序语句

  7:执行排序语句

  如:select count(gid),gname from shopping_goods where gcid=1 group
by gname having count(gid)>1 order by count(gid) desc

  如:select count(gid),gname from shopping_goods where gcid=1 group
by gname having count(gid)>1 order by count(gid) desc

  1:首页查询shopping_goods 表,获得表中的多少

  1:首页查询shopping_goods 表,获得表中的数量

  2:执行where,过滤出gcid=1的商品。

  2:执行where,过滤出gcid=1的商品。

  3:对gname进行分组。

  3:对gname实行分组。

  4:使用聚合函数count(),总括出商品品种为1,分裂商品名称的数量.

  4:使用聚合函数count(),总括出商品品种为1,分歧商品名称的数量.

  5:使用having,过滤出类型为1,商品总括数据超出1的货色

  5:使用having,过滤出类型为1,商品总括数据超越1的商品

  6:执行select语句

  6:执行select语句

  7:执行order by ,依照商品数量降序排列。

  7:执行order by ,依照商品数量降序排列。

二:百万数据量优化

二:百万数据量优化

  那里只介绍查询和改动的方式,假诺是系统优化,需求从表结构,索引,表分区等方面处理。

  那里只介绍查询和修改的主意,如果是系统优化,须求从表结构,索引,表分区等地点处理。

  1:合理利用索引,在2个大数据量的表中,并不是索引更多越好,索引更多,写操作越慢,提议在偏下字段上创制索引。

  1:合理施用索引,在二个大数据量的表中,并不是索引更多越好,索引更多,写操作越慢,提议在偏下字段上创建索引。

  ●在时时开始展览再而三,可是并未点名为外键的列上建立目录,而不平时连接的字段则由优化器自动生成索引。

  ●在平常实行连接,不过没有点名为外键的列上建立目录,而不日常连接的字段则由优化器自动生成索引。

  ●在反复举办排序或分组(即开始展览group by或order by操作)的列上建立目录。

  ●在屡次实行排序或分组(即开始展览group by或order by操作)的列上建立目录。

  ●在规范表明式中时时采纳的不等值较多的列上建立检索,在分裂值少的列上不要确立目录。比如在雇员表的“性别”列上唯有“男”与“女”多少个例外值,因而就无要求建立目录。假若成立目录不但不会拉长查询效用,反而会严重消沉更新速度。

  ●在原则表达式中常常采纳的分裂值较多的列上建立检索,在区别值少的列上不要确立目录。比如在雇员表的“性别”列上唯有“男”与“女”三个例外值,因而就无须求建立目录。假诺创造目录不但不会拉长查询效能,反而会严重消沉更新速度。

  ●要是待排序的列有多个,能够在这一个列上建立复合索引(compound index)。

  ●假如待排序的列有多个,能够在那个列上建立复合索引(compound index)。

  ●使用系统工具。如Informix数据库有二个tbcheck工具,能够在困惑的目录上开始展览检查。在局地数据库服务器上,索引大概失效或许因为频仍操作而使得读取效用降低,假设1个行使索引的查询不明不白地慢下来,能够试着用tbcheck工具检查索引的完整性,要求时开始展览修补。其余,当数码库表更新大批量数码后,删除比量齐观建索引能够增长查询速度。

  ●使用系统工具。如Informix数据库有一个tbcheck工具,能够在狐疑的目录上开始展览检讨。在有些数据库服务器上,索引大概失效只怕因为反复操作而使得读取功效下落,要是2个选用索引的询问不明不白地慢下来,能够试着用tbcheck工具检查索引的完整性,须要时展开修复。其它,当数码库表更新大批量数量后,删除同等对待建索引能够拉长查询速度。

  2:尽量少用(恐怕不用)sqlserver
自带的函数

  2:尽量少用(只怕不用)sqlserver
自带的函数

  a):如dateadd(month,-1,getdate()),请使用time>’2017-09-19
23:42:44.770 ‘代替dateadd.

  a):如dateadd(month,-1,getdate()),请使用time>’2017-09-19
23:42:44.770 ‘代替dateadd.

  b):如datediff(day,’2017-10-20′,’2017-10-25′),select
datepart(day,getdate());,如需总计八个日子从前的差值,大概取得日期中的整数部分,建议查询达成后用java程序来估测计算,不要什么都让数据库来做.

  b):如datediff(day,’2017-10-20′,’2017-10-25′),select
datepart(day,getdate());,如需总结多少个日子在此之前的差值,大概取得日期中的整数部分,建议查询实现后用java程序来总结,不要什么都让数据库来做.

  c:) 如:substring(name,1,3) =
’abc’,提出修改为 name like ‘abc%’

  c:) 如:substring(name,1,3) =
’abc’,建议修改为 name like ‘abc%’

 

 

  3:尽量不要在 where
子句中对字段实行 null
值判断,不然将促成斯特林发动机放任接纳索引而展开全表扫描,强烈建议where涉及的列,不要留空,创造表时予以伊始值

  3:尽量不要在 where
子句中对字段举办 null
值判断,不然将促成斯特林发动机放弃采取索引而展开全表扫描,强烈提议where涉及的列,不要留空,创制表时授予开首值

错误
select id from table where name is not null
正确
create table table(name varchar(20) default '')
错误
select id from table where name is not null
正确
create table table(name varchar(20) default '')

   4:应尽量防止在 where 子句中行使 != 或 <>
操作符,不然将引擎遗弃采用索引而实行全表扫描。

   4:应尽量防止在 where 子句中选用 != 或 <>
操作符,不然将引擎丢弃选取索引而开始展览全表扫描。

   

   

错误
select id from table where id <> 100 
错误
select id from table where id <> 100 

  5:应尽量制止在 where 子句中利用 or
来三番五次条件,假如3个字段有目录,贰个字段没有索引,将导致内燃机扬弃选拔索引而进展全表扫描,提出利用unall
来取代or

  5:应尽量防止在 where 子句中利用 or
来连接条件,假如二个字段有目录,二个字段没有索引,将造成内燃机舍弃使用索引而进行全表扫描,建议利用unall
来替代or

  

  

select id from table where num=1 or Name = 'zhangsan'
建议修改为
select id from table where num=1 
unionall 
select id from table where  name = 'zhangsan'
select id from table where num=1 or Name = 'zhangsan'
建议修改为
select id from table where num=1 
unionall 
select id from table where  name = 'zhangsan'

  6:提议使用exists 来代表in,能用between 就无须采取in 如:age in
(20,21,22)提议修改为:age between 20 and 22

  6:提议使用exists 来代表in,能用between 就无须选拔in 如:age in
(20,21,22)建议修改为:age between 20 and 22

  

  

最早此处sql有误,感谢  宝宝心里苦,宝宝不说  的指出。
select id from t where role in (select rid from role where rName = '经理')
建议修改为
select id from t as a where exists (select rid from role  as b where a.role  = b.rid and rName = '经理')
最早此处sql有误,感谢  宝宝心里苦,宝宝不说  的指出。
select id from t where role in (select rid from role where rName = '经理')
建议修改为
select id from t as a where exists (select rid from role  as b where a.role  = b.rid and rName = '经理')

  7:like 的用法

  7:like 的用法

  除了 title  like ‘艾哈迈达巴德%’ ,其余使用方法(如:title like  ‘%王%’ title
like ‘%天’)也将造成全表扫描

  除了 title  like ‘艾哈迈达巴德%’ ,其它使用办法(如:title like  ‘%王%’ title
like ‘%天’)也将导致全表扫描

    8:where 中尽量不要出现表明式总结

    8:where 中尽量不要出现表达式总括

  如:

  如:

select id from t where num/2 = 100
select id from t where num/2 = 100

  应改为:

  应改为:

select id from t where num = 100*2
select id from t where num = 100*2

  9:Update
语句,假如只变动① 、二个字段,不要Update全体字段,不然频仍调用会挑起分明的属性消耗,同时带来大气日记。强烈提议修改时使用动态sql语句,类似hibernate中dynamic-update=true,但是hibernate需求将修改对像经过id查询出来,才会动态修改,假设是普通sql,直接组装就足以。

  9:Update
语句,即便只变动壹 、二个字段,不要Update全体字段,不然频仍调用会唤起强烈的习性消耗,同时带来大气日志。强烈提出修改时选用动态sql语句,类似hibernate中dynamic-update=true,可是hibernate要求将修改对像经过id查询出来,才会动态修改,如若是一般sql,直接组装就足以。

  10:对于多张大数据量(那里几百条即使大了)的表JOIN,要先分页再JOIN,不然逻辑读会很高,质量很差.

  10:对于多张大数据量(那里几百条固然大了)的表JOIN,要先分页再JOIN,不然逻辑读会很高,质量很差.

  11:不要写一些从未有过意义的询问,如须要生成八个空表结构:

  11:不要写一些一向不意思的询问,如必要生成3个空表结构:

select col1,col2 into #t from t where 1=0
select col1,col2 into #t from t where 1=0

 

 

  12:尽量接纳数字型字段,若只含数值音讯的字段尽量不要设计为字符型,那会下跌查询和一连的属性,并会扩大存款和储蓄开支。那是因为引擎在拍卖查询和连
接时会各个比较字符串中每二个字符,而对此数字型而言只必要比较3次就够了。

  12:尽量选择数字型字段,若只含数值音讯的字段尽量不要设计为字符型,这会下落查询和连接的质量,并会增添存款和储蓄开销。那是因为引擎在拍卖查询和连
接时会每一个相比字符串中每三个字符,而对此数字型而言只供给比较贰遍就够了。

  13:尽大概的运用 varchar/nvarchar 代替
char/nchar ,因为首先变长字段存储空间小,能够省去存款和储蓄空间,其次对于查询来说,在叁个相对较小的字段内寻找频率斐然要高些。

  13:尽也许的施用 varchar/nvarchar 代替
char/nchar ,因为首先变长字段存款和储蓄空间小,能够节省存款和储蓄空间,其次对于查询来说,在二个争辨较小的字段内搜寻频率斐然要高些。

  14:不提出选取 select * from t
,用实际的字段列表代替“*”,不要回来用不到的别的字段。

  14:不建议利用 select * from t
,用现实的字段列表代替“*”,不要回来用不到的其他字段。

  15:尽量防止使用游标,因为游标的功效较差,假设游标操作的数码超过1万行,那么就应有考虑改写。

  15:尽量防止使用游标,因为游标的功用较差,假诺游标操作的数量超越1万行,那么就应有考虑改写。

  16:在富有的存款和储蓄进程和触发器的初始处设置 SET NOCOUNT ON
,在得了时设置 SET NOCOUNT OFF
。无需在进行存款和储蓄进度和触发器的种种语句后向客户端发送 DONE_IN_PROC
消息。

  16:在具有的蕴藏进度和触发器的初叶处安装 SET NOCOUNT ON
,在截至时设置 SET NOCOUNT OFF
。无需在履行存款和储蓄进程和触发器的各样语句后向客户端发送 DONE_IN_PROC
消息。

  17:尽量幸免大事务操作,升高系统出现能力。并且永不事情嵌套,不要在工作中去调用其余系统的接口,不要在作业中耗费时间操作,不然死锁并伴您左右

  17:尽量幸免大事务操作,提高系统出现能力。并且不要事情嵌套,不要在事情中去调用任何系统的接口,不要在工作中耗费时间操作,否则死锁并伴您左右

  18:尽量幸免向客户端重临大数据量,若数据量过大,应该考虑相应要求是或不是站得住。(小编曾经处理过,从3000万手提式无线电话机号码库中,模糊查询出上万个手机号码,那种需要是客户硬性必要,就要通过executorservice了,不要直接写sql查)

  18:尽量幸免向客户端再次回到大数据量,若数据量过大,应该考虑相应要求是或不是合理。(小编曾经处理过,从2000万手提式有线电话机号码库中,模糊查询出上万个手提式无线电话机号码,这种供给是客户硬性要求,就要通过executorservice了,不要直接写sql查)

  19:假如数据库是mysql,一定要利用数据库引擎,不一致工作要利用分化的数据库引擎。比如常用的innodb和myisam,innodb扶助理工科程师作,辅助外键,锁是表级锁,缺点是询问速度慢,Myisam
的执行进程更快,性能更好,但不协理外键,不协助理工科程师作,锁是行锁级。比如日志表,数据量大,强烈提议使用myisam引擎.

  19:假若数据库是mysql,一定要利用数据库引擎,不一样工作要选用差异的数据库引擎。比如常用的innodb和myisam,innodb协理工科作,支持外键,锁是表级锁,缺点是查询速度慢,Myisam
的履行进程更快,质量更好,但不辅助外键,不协理理工科程师作,锁是行锁级。比如日志表,数据量大,强烈建议使用myisam引擎.

 

 

  以上某个来自网络,有个别来自工作中的总计,中期还会完善,如有错误,请提出,多谢。

  以上有些来自互连网,有些来自工作中的总结,前期还会圆满,如有错误,请提出,多谢。

 

 

 

 

相关文章