有个小伙伴问起,关于SQL语句怎么知道写的好不好,本人还是单独写一篇文章,以常见的一个GROUP BY为例,了解如何去对SQL语句是怎么执行与怎么做优化吧

先做准备工作,在test数据库里面新建一张users表,并插入测试数据:

CREATE TABLE users(id int IDENTITY(1,1) NOT NULL,uname nchar(10) NULL,city nchar(10) NULL,income int NULL)INSERT INTO users(uname,city,income)VALUES('小李子','台湾',8000)
INSERT INTO users(uname,city,income)VALUES('五爷','上海',8800)
INSERT INTO users(uname,city,income)VALUES('疯子','南京',6000)
INSERT INTO users(uname,city,income)VALUES('张三','北京',12000)
INSERT INTO users(uname,city,income)VALUES('李四','台湾',14000)
INSERT INTO users(uname,city,income)VALUES('小四','北京',3000)
INSERT INTO users(uname,city,income)VALUES('丽丽','北京',2000)
INSERT INTO users(uname,city,income)VALUES('钱二爷','杭州',9000)
INSERT INTO users(uname,city,income)VALUES('张国荣','香港',1000)
INSERT INTO users(uname,city,income)VALUES('巩俐','北京',1800)
INSERT INTO users(uname,city,income)VALUES('大哥大','长沙',9000)
INSERT INTO users(uname,city,income)VALUES('梁朝伟','香港',18000)
INSERT INTO users(uname,city,income)VALUES('汤唯','香港',20000)
INSERT INTO users(uname,city,income)VALUES('小唐','长沙',16000)
INSERT INTO users(uname,city,income)VALUES('小薇','北京',3000)
INSERT INTO users(uname,city,income)VALUES('Tony','香港',80000)

然后我们来查询每个城市有多少用户数:

SELECT city,count(*)  AS NUM  FROM users GROUP BY citycity           NUM
北京          5
长沙          2
杭州          1
南京          1
上海          1
台湾          2
香港          4

查看每个城市最多收入的金额是多少:

SELECT city,MAX(income) FROM users GROUP BY citycity         (无列名)
北京          12000
长沙          16000
杭州          9000
南京          6000
上海          8800
台湾          14000
香港          80000

我们来看下上面的查询是如何执行的,我们点击“执行”,“调式”,右边不远处有一个“包括实际的执行计划”按钮或者右键也可以看到,选中即可,然后执行SQL语句,将出现“执行计划

我们可以看出开销主要是Sort排序(78%)和Table Scan全表扫描(22%)。GROUP BY是分组函数,一般会跟一些聚集函数搭配使用,比如:
查看收入大于8000的执行情况

SELECT city,count(*)  AS NUM  FROM users WHERE income>8000 GROUP BY city 

查看所在城市用户数大于3的城市,这里需要注意的是,不能使用HAVING NUM >3,没有权限使用别名,不然会报错:列名 'NUM' 无效。

SELECT city,count(*) AS NUM  FROM users  GROUP BY city HAVING count(*) >3city         NUM
北京          5
香港          4

从上面图中我们知道这个开销主要集中在了排序上面,这个时候我们可以为这个字段建一个索引来解决排序问题:

CREATE INDEX IDX_CITY ON users(city)

我们再执行SQL语句,看下实际情况

        可以发现排序与全表扫描的开销,现在成了索引扫描了,因为已经建立好了索引,索引就是拿来快速检索使用的。所以一般来说学数据库,首先从实际业务出发,将表结构设计好,其次在实际数据处理当中,就使用执行计划查看开销主要是在哪几个地方,然后做相应的优化处理。
        随着表存储的数据越来越多,时间久了,会造成效率越来越低,存在很多的碎片等,这个时候需要对数据库所有表做一个索引重建。关于更多索引资料可以参看:SQLSERVER索引汇总https://blog.csdn.net/weixin_41896770/article/details/100939372

SQLSERVER优化SQL的方法(执行计划)相关推荐

  1. SQL Server查询执行计划–基础

    为什么查询执行对SQL Server性能很重要? (Why is query execution important for SQL Server performance?) SQL Server性能 ...

  2. sql查询初学者指南_面向初学者SQL Server查询执行计划–类型和选项

    sql查询初学者指南 When a DBA is working with the SQL Server, he/she might sometimes say that the execution ...

  3. sql查询初学者指南_面向初学者SQL Server查询执行计划–非聚集索引运算符

    sql查询初学者指南 Now that we understand what Clustered Index Scan and Clustered Index Seek are, how they o ...

  4. 面向初学者的 SQL Server 查询执行计划(1)——聚集索引运算符(Clustered Index)

    在本文中,我们将讨论与聚集索引相关的各种执行计划运算符,以及它们的作用.它们何时出现以及它们何时出现. 执行计划中的每一个运算符都会提供一些有关 SQL Server 运行方式的指标. 我们需要理解这 ...

  5. 了解Sql Server的执行计划

    前一篇总结了Sql Server Profiler,它主要用来监控数据库,并跟踪生成的sql语句.但是只拿到生成的sql语句没有什么用,我们可以利用这些sql语句,然后结合执行计划来分析sql语句的性 ...

  6. oracle数据库通过SQL profile 绑定SQL最优执行计划(个人实践)

    1.执行SQL语句,同时使用如下命令查找SQL ID select a.SQL_ID,b.SQL_TEXT,b.LAST_LOAD_TIME,b.LAST_ACTIVE_TIME   from v$s ...

  7. sql查询初学者指南_面向初学者SQL Server查询执行计划–聚集索引运算符

    sql查询初学者指南 We have discussed how to created estimated execution plans and actual execution plans in ...

  8. SQL Server实际执行计划COST欺骗案例

    有个系统,昨天Support人员发布了相关升级脚本后,今天发现系统中有个功能不能正常使用了,直接报超时了(Timeout expired)的错误.定位到相关相关存储过程后,然后在优化分析的过程中,又遇 ...

  9. 利用sql profile固定执行计划加快OGG同步

    ogg是逻辑同步,不想ADG利用后镜像直接修改block中的内容,ogg是根据redo片中SQL,以及SQL对应的后镜像值进行表的修改,这样如果大表上面没有索引,或者走错索引就会导致同步慢.但是OGG ...

最新文章

  1. 面试之Hashtable和ConcurrentHashMap
  2. centos下如何停止ping命令
  3. S5PV210之Sate210-F DIY硬件,移植uboot,kernel,android 活动现在已经进入实施阶段吗,欢迎广大网友参与 !...
  4. mysql 报错1045 - Access denied for user “root” @ 192.111.111.11 (using password: YES)
  5. 使用PHP发送邮件的两种方法
  6. php 斗鱼人数,斗鱼旭旭宝宝再度登顶指数榜首位 单日弹幕人数高达48万人
  7. shell脚本if中判断大于、小于、等于、不等于的符号
  8. Geotrellis系列文章链接
  9. 龙格现象python程序_基于切比雪夫多项式的函数插值逼近
  10. 程序员必备神器(FastStoneCapture)
  11. 麦咖啡服务器怎么进系统,麦咖啡(McAfee)系统托盘图标不见了怎么办?
  12. 【JS】用JS发送电子邮件
  13. python 中 while 语句的练习题
  14. 机器学习 | 线性方法降维(理论篇)
  15. 阿里云轻量级云服务器部署Java项目
  16. 如何做好服务器的维护
  17. zzzfun网站连接不上服务器,ZzzFun
  18. i7 10700和10700f 10700k这三个CPU有什么区别
  19. 2021年最新Java学习路线图
  20. java为什么匿名内部类的参数引用需要添加final?

热门文章

  1. 量化投资 –--- 技术篇 (开篇)
  2. IP 转换为实际地址 《一》
  3. 2.CCNA第二天-主机到主机通讯模型
  4. 这个618,网工最值得买的路由器/交换机设备
  5. 主机检测存在未通过的检查项
  6. VBA 快速实现Word三线表
  7. 微信开发者工具突然打不开问题解决
  8. 王通:站内搜索引擎的SEO策略
  9. wfe进不了standby模式怎么办
  10. fx系列微型可编程控制器 通信_三菱PLC各系列PLC通讯技术综述,绝对全面!