sql 不等于优化_SQL优化之不查询多余的行和列

cf8a1dddd0f6d1d1bb602b4947a7f6e3.png

从今天开始,会给大家普及一点优化的小技巧。感兴趣的同学可以跟着多多练练手。

示例数据库可以在

https://pan.baidu.com/s/1i7eVmap​pan.baidu.com

这里获取。我使用的示例是AdventureWorks2012的备份包,小伙伴下载后还原即可。

记得数据库要是高版本的才能还原成功,我使用的数据库是SQL Server 2016版本的。

1、不查多余的列

查询过程中经常为了省事,而直接使用*来代替所有的列,好处是不需要写明列。坏处就是遇到列比较多的表查询效率就大大折扣了。例如:

SELECT * FROM [Sales].[SalesOrderDetail];

我们执行一下可以看到如下信息:

4f3829787729b69230afd805ce30b0e4.png

Q:上面的消息界面是怎么出来的呢?

A:点击菜单栏的查询——查询选项...——高级,将SET STATISTICS TIME和SET STATISTICS IO都勾选上就可以了


上面的相关信息我给大家解读一下:

扫描计数:索引或表扫描次数

逻辑读取:数据缓存中读取的页数

物理读取:从磁盘中读取的页数

预读:查询过程中,从磁盘放入缓存的页数

lob逻辑读取:从数据缓存中读取,image,text,ntext或大型数据的页数

lob物理读取:从磁盘中读取,image,text,ntext或大型数据的页数

lob预读:查询过程中,从磁盘放入缓存的image,text,ntext或大型数据的页数

语句的CPU时间分编译阶段执行阶段

CPU时间是指:执行语句的时间

占用时间是指:从磁盘读取数据再处理总的使用时间

编译阶段:

SQL Server 分析和编译时间:

执行阶段:

SQL Server 执行时间:

这些信息我们以后都会经常看到的,这是判断一个查询语句最直观的方式。

我们再单独查询一列看会怎么样?例如:

SELECT UnitPrice FROM [Sales].[SalesOrderDetail];

我们执行一下可以看到如下信息:

147601c9726bc70ce1a5e2c51d5dcc11.png

通过上面的时间对比我们就可以清楚的看到:将列名明确的列出,不显示不相关的列效率有很大的提升。

这里就是大家经常看到的一条优化建议:不要直接使用*进行查询,而只查询需要的列。

2、不查多余的行

  • 在查询的时候使用WHERE关键字可以很好的过滤掉不需要的行。这也是提高查询效率的一种方式,其实这才是WHERE关键字存在的意义。例如:
SELECT UnitPrice FROM [Sales].[SalesOrderDetail] WHERE UnitPrice>1000;

我们执行一下可以看到如下信息:

47fbc6332bb19e66c24104a7448952b2.png

所占用的时间成倍的减少,效果显而易见。

  • 使用DISTINCT关键字减少多余重复的行。
    例如:
SELECT DISTINCT UnitPrice
FROM [Sales].[SalesOrderDetail]
WHERE UnitPrice>1000;

我们执行一下可以看到如下信息:

20044e65cdc09e26dcd459e77c2828b7.png

可能有些同学对DISTINCT关键字有不同的看发,稍后我们根据具体情况再逐一给大家进行分析。

今天的内容就分享到这里啦,觉得不错记得转发分享给更多人~

0023cc24cb379a10bc6a36947db59202.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值