前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL优化

SQL优化

作者头像
挑战者
发布于 2019-03-19 09:16:51
发布于 2019-03-19 09:16:51
5.3K00
代码可运行
举报
文章被收录于专栏:java沉淀java沉淀
运行总次数:0
代码可运行

一、SQL语句编写注意问题

下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。

1. IS NULL 与 IS NOT NULL

任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。

2. 联接列

对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表(employee),对于 一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill Cliton)的职工。

下面是一个采用联接查询的SQL语句,这条语句完全可以查询出是否有Bill Cliton这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  select * from employss where first_name||||last_name =’Beill Cliton';

当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   *** where first_name =’Beill’ and last_name =’Cliton';
3. 带通配符(%)的like语句

同样以上面的例子来看这种情况。目前的需求是这样的,要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  select * from employee where last_name like ‘%cliton%';
  • 这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通 配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  select * from employee where last_name like ‘c%';
4. Order by语句

ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。

仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。

5. NOT

我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子:

… where not (status =’VALID’)

如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例:

… where status <>’INVALID';

对这个查询,可以改写为不使用NOT:

select * from employee where salary<3000 or salary>3000;

虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。

虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。

二、写优良SQL的基本规则

1、对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度

2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如select id from t where num is null。任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。

3、最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.NULL值也是可能会需要占用空间的,一些定长的数据类型即使数据为NULL也是会占用空间的。

4、应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。

5、应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,可以使用union/union all 代替

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.03.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
携程火车票非用户端AB实验的分流算法
导读:携程火车票部门为解决智行酒店商户侧 AB 实验中,预实验分流中遇到的分流不均、分流组流量交叉问题,提出了一种用于非用户端 AB 实验的分流算法,该算法通过优化的随机抽样模块与贪心交换模块,保证实验组之间多指标的相似性;通过图算法模块,降低实验组之间的流量交叉。通过实证分析,该算法一方面有效的提升了商户端实验在多指标下的分流效率;另一方面,相比于使用先验知识进行分流,显著降低了实验组之间的流量交叉。
深度学习与Python
2025/07/02
520
携程火车票非用户端AB实验的分流算法
美团配送A/B评估体系建设与实践
2019年5月6日,美团正式推出新品牌“美团配送”,发布了美团配送新愿景:“每天完成一亿次值得信赖的配送服务,成为不可或缺的生活基础设施。”现在,美团配送已经服务于全国400多万商家和4亿多用户,覆盖2800余座市县,日活跃骑手超过70万人,成为全球领先的分钟级配送网络。
美团技术团队
2020/06/01
9340
美团配送A/B评估体系建设与实践
「经验」带你掌握AB实验最佳流程
阅读建议:本文是实战中总结出的「AB实验最佳流程」,其中内容涉及数据分析、产品、运营、研发的工作,帮助你更科学的评估实验。由于篇幅较长,建议「关注」「收藏」,闲暇时间拿来品品。
小火龙说数据
2022/06/30
4.3K0
「经验」带你掌握AB实验最佳流程
算法AB实验平台进化历程和挑战
AB 实验平台这几年在互联网公司得到了越来越广泛的应用,采用 AB 实验来评估产品和技术迭代效果也成为主流的业务新功能效果评估方式,数据驱动的文化在这几年得到了不少公司的广泛的认同,通过数据和指标来说明产品效果也得到了越来越多的公司的认可和应用。
得物技术
2023/09/11
1K0
笔记︱盘点实验科学的三种实验模型(A/B实验、因果推断、强化学习)
含有大量观测数据的情况下,可以使用各类合成A/B的方式,包括matching、合成控制等
悟乙己
2022/05/31
1.9K0
笔记︱盘点实验科学的三种实验模型(A/B实验、因果推断、强化学习)
笔记︱一轮完美的A/B Test 需要具备哪些要素?
文章[2] 策略的改变,不是由我们随便“拍脑袋”得出,而是一种建立在数据基础上的思维方式,数据反馈会告诉我们做的好不好,哪里有问题,以及衡量可以带来多少确定性的增长。
悟乙己
2021/12/10
3.3K0
笔记︱一轮完美的A/B Test 需要具备哪些要素?
vivo 霍金实验平台设计与实践-平台产品系列02
本篇介绍了vivo霍金实验平台的系统架构以及业务发展过程中遇到的问题以及对应的解决方案。
2020labs小助手
2022/11/21
9401
AB实验的踩坑之路
AB实验是互联网行业产品功能优化和迭代常用的工具,覆盖了大部分的需求场景,如内容推荐、搜索、商业化、UI迭代等。从统计学的角度出发,AB实验本质上是使用假设检验去证明假设是否成立,从而达到验证我们想法的目的。本文记录了在日常使用AB实验中涉及到的一些比较常见的陷阱。
曲奇
2022/05/09
1.3K0
AB实验的踩坑之路
A/B Test︱一轮完美的A/B Test 需要具备哪些要素(一)
文章[2] 策略的改变,不是由我们随便“拍脑袋”得出,而是一种建立在数据基础上的思维方式,数据反馈会告诉我们做的好不好,哪里有问题,以及衡量可以带来多少确定性的增长。
悟乙己
2022/01/21
9.3K0
A/B Test︱一轮完美的A/B Test 需要具备哪些要素(一)
互联网都在用的A/B 测试是什么?
做过App功能设计的读者朋友可能经常会面临多个设计方案的选择,例如某个按钮是用蓝色还是黄色,是放左边还是放右边。
猴子聊数据分析
2020/03/11
5940
如何做一次完美的 ABTest?
越来越多的公司都在尝试 ABTest,要么是自己搭建系统,要么依赖于第三方的系统。那么在我们进行ABTest的时候,必备的基础知识有哪些?该如何一步一步的进行AB实验呢?本文将根据 AB 实验的流程带领大家一窥究竟。
2020labs小助手
2020/06/11
1.9K0
终于有人把A/B测试讲明白了
导读:对照实验有时也称为A/B测试、A/B/n 测试(强调多变体测试)、实地实验、随机对照实验、分拆测试、分桶测试和平行飞行测试。本文带你了解一些相关术语及应用案例。
IT阅读排行榜
2021/05/06
1.1K0
亿级流量实验平台设计实践
大家好,我是虫爸。今天给大家分享一款亿级流量实验平台。在互联网行业,要上线一个策略(CTR预估、CVR预估等),或者一个功能,如果贸然全量上线,那么如果新策略效果不佳,可能会造成不小的损失,要么丢失用户,要么损失收入。
高性能架构探索
2022/08/25
6540
亿级流量实验平台设计实践
机器学习面试题集 - 如何进行 A/B 测试
当要决定一个产品或者新功能是否真的可以上线时,就要做A/B 测试,我们要看这个新的产品或者新的特征是否会对一些商业指标产生影响,A/B 测试的结果决定了产品是否可以上线。
杨熹
2019/06/11
8080
机器学习面试题集 - 如何进行 A/B 测试
如何设计一个 A/B test?
作者:刘健阁(Jiange Liu),PCG 数据分析师 实验设计 AB Test 实验一般有 2 个目的: 判断哪个更好:例如,有 2 个 UI 设计,究竟是 A 更好一些,还是 B 更好一些,我们需要实验判定 计算收益:例如,最近新上线了一个直播功能,那么直播功能究竟给平台带了来多少额外的 DAU,多少额外的使用时长,多少直播以外的视频观看时长等 我们一般比较熟知的是上述第 1 个目的,对于第 2 个目的,对于收益的量化,计算 ROI,往往对数据分析师和管理者非常重要。 对于一般的 ABTest 实验
腾讯大讲堂
2020/03/27
2.4K0
微信基于 StarRocks 的实时因果推断实践
因果推断的核心概念是,从数据中推断一个变量对另一个变量的影响程度。简单来说,它帮助我们了解因果关系的存在和影响力。例如,如果我们上线了一个新的算法模型,能否提升 DAU(日活跃用户)?又或者一个新的产品UI能否增加点击率?这些问题本质上是在问:我们当前所采取的措施是否有效?做得是否正确?因果推断正是用来回答这些问题的,它帮助我们做出科学的决策。
StarRocks
2025/03/13
1210
微信基于 StarRocks 的实时因果推断实践
A/B测试vs灰度测试vs蓝绿部署
A/B测试 简单来说,A/B测试是一种比较两个版本的测试,以确定哪个版本的性能更好。 在A/B测试中,部分用户会接收到“版本A”,其他用户则会接收“版本B”。 这是一个可控的过程。为了进行实验,用户组被分成两组。“A组”通常被称为“对照组”,继续接收现有的产品版本。而“B组”通常被称为“实验组”,根据待测量指标,收到不同的实验数据。 最后,比较两组不同指标的结果,以确定哪个版本性能更好。 灰度测试 灰度测试是一种通过向一小部分用户发布新版本,来降低风险和验证新版本的方法。 由于新功能只分发给少数用户,因
Yuyy
2022/09/21
4920
A/B测试vs灰度测试vs蓝绿部署
基因突变不是随机的?!Nature最新论文挑战进化论
博雯 丰色 发自 凹非寺 量子位 | 公众号 QbitAI 基因突变,不是随机的? 这与当前教材里的结论,截然相反。 还记得中学生物课本里一众白眼果蝇、白毛小牛、或者长颈鹿、短颈鹿吗? 在这些例子中,突变要么由外界人为导致,要么就是随机,只有自然选择能决定哪些突变会出现在生物体内。 但现在,一篇刊登在Nature上的最新论文,用实验结果提出了这样一个颠覆性的观点: 突变出现的基因组区域有着明显的规律性,并非随机! 比如说,在对生存起决定性作用的必需基因区域,其突变率就几乎下降了2/3。 论文开门见山地表示
量子位
2022/03/04
3460
有赞ABTest系统:数据驱动增长实践
有赞是一个商家服务公司,致力于帮助每一位重视产品和服务的商家成功。随着移动互联网的流量增长红利渐渐褪去,商家获得新的流量越来越困难,帮助商家实现更有效的流量转化与长期目标的增长是有赞SaaS服务的应有之义;同时,随着有赞SaaS功能的不断完善,服务的商家不断增多,而业务场景也越来越复杂,考虑到有限的研发资源,提升产品和技术的迭代效率成为当务之急。
有赞coder
2020/08/24
2K0
有赞ABTest系统:数据驱动增长实践
一文助你上年薪30w,史上最全AB-Test知识点
越来越多的公司重视AB测试,按照猫哥的经验,之前会Excel就行,SQL是加分项。后来变成了必须懂SQL,AB测试是加分项。再到后来变成了,AB测试和SQL都是必会的东西。
巡山猫说数据
2021/12/15
1.5K0
一文助你上年薪30w,史上最全AB-Test知识点
推荐阅读
相关推荐
携程火车票非用户端AB实验的分流算法
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 一、SQL语句编写注意问题
    • 下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。
  • 二、写优良SQL的基本规则
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档