当前位置: 首页 > 编程日记 > 正文

SQL语句优化技术分析

SQL语句优化技术分析

操作符优化 

IN 操作符 

用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。 

但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: 

    ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 

    推荐方案:在业务密集的SQL当中尽量不采用IN操作符。 

NOT IN操作符 

    此操作是强列推荐不使用的,因为它不能应用表的索引。 

    推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替 

<> 操作符(不等于) 

    不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 

推荐方案:用其它相同功能的操作运算代替,如 

    a<>0 改为 a>0 or a<0 

    a<>’’ 改为 a>’’ 

IS NULL 或IS NOT NULL操作(判断字段是否为空) 

    判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。 

    推荐方案: 

用其它相同功能的操作运算代替,如 

    a is not null 改为 a>0 或a>’’等。 

    不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请。 

    建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使性能下降,多人更新操作会增加数据块锁的现象) 



> 及 < 操作符(大于或小于操作符) 

    大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。 



LIKE操作符 

LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。 



UNION操作符 

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如: 

select * from gc_dfys 

union 

select * from ls_jg_dfys 

这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 

推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。 

select * from gc_dfys 

union all 

select * from ls_jg_dfys 



SQL书写的影响 

同一功能同一性能不同写法SQL的影响 

如一个SQL在A程序员写的为 

    Select * from zl_yhjbqk 

B程序员写的为 

    Select * from dlyx.zl_yhjbqk(带表所有者的前缀) 

C程序员写的为 

    Select * from DLYX.ZLYHJBQK(大写表名) 

D程序员写的为 

    Select * from DLYX.ZLYHJBQK(中间多了空格) 



以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL 都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则ORACLE只会分析一次,共享内存也只会留下一次的分析结果,这不仅可以减少分析SQL的时间,而且可以减少共享内存重复的信息,ORACLE也可以准确统计SQL的执行频率。 



WHERE后面的条件顺序影响 



WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如 

Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1 

Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下' 

以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较,而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。 



查询表顺序的影响 

在FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接,由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行了统计分析,ORACLE会自动先进小表的链接,再进行大表的链接)

SQL语句索引的利用 

对操作符的优化(见上节) 

对条件字段的一些优化 

采用函数处理的字段不能利用索引,如: 

substr(hbs_bh,1,4)=’5400’,优化处理:hbs_bh like ‘5400%’ 

trunc(sk_rq)=trunc(sysdate), 优化处理: 

sk_rq>=trunc(sysdate) and sk_rq<trunc(sysdate+1) 

进行了显式或隐式的运算的字段不能进行索引,如: 

ss_df+20>50,优化处理:ss_df>30 

‘X’||hbs_bh>’X5400021452’,优化处理:hbs_bh>’5400021542’ 

sk_rq+5=sysdate,优化处理:sk_rq=sysdate-5 

hbs_bh=5401002554,优化处理:hbs_bh=’ 5401002554’,注:此条件对hbs_bh 进行隐式的to_number转换,因为hbs_bh字段是字符型。 

条件内包括了多个本表的字段运算时不能进行索引,如: 

ys_df>cx_df,无法进行优化 

qc_bh||kh_bh=’5400250000’,优化处理:qc_bh=’5400’ and kh_bh=’250000’ 



应用ORACLE的HINT(提示)处理 



提示处理是在ORACLE产生的SQL分析执行路径不满意的情况下要用到的。它可以对SQL进行以下方面的提示 

目标方面的提示: 

COST(按成本优化) 

RULE(按规则优化) 

CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化) 

ALL_ROWS(所有的行尽快返回) 

FIRST_ROWS(第一行数据尽快返回) 

执行方法的提示: 

USE_NL(使用NESTED LOOPS方式联合) 

USE_MERGE(使用MERGE JOIN方式联合) 

USE_HASH(使用HASH JOIN方式联合) 

索引提示: 

INDEX(TABLE INDEX)(使用提示的表索引进行查询) 

其它高级提示(如并行处理等等) 

相关文章:

官方抓虫,PyTorch 新版本修复 13 项 Bug

整理 | 寇雪芹头图 | 下载于视觉中国出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;近日&#xff0c;PyTorch 发布了新版本 PyTorch 1.8.1&#xff0c;相比3月4日从 PyTorch 1.7 到 1.8 的重要更新&#xff08; 1.8 版本主要包括编译器和分布式训练更新&…

开发webpart时建立图像文件夹和CSS,js文件夹

如图所示&#xff1a;是通过添加映射来完成&#xff0c;做好之后&#xff0c;把图像拷到文件夹时&#xff0c;当ascx文件里需要用到图像时&#xff0c;直接把图像拖到ascx文件里的位置。这样就知道该图像的路径 了。转载于:https://www.cnblogs.com/oymx/p/3490175.html

AI金融若不解决这些问题,等于在制造新的不可解问题

人们对新事物总是充满恐惧。就在大家担心无人驾驶汽车是否弊大于利的时候&#xff0c;AI重塑金融规律的创新也引起许多人对其中的法律和道德问题的顾虑。 让一个软件程序来决定&#xff0c;谁拥有投资开户的资格&#xff0c;谁能够获得贷款&#xff08;征信&#xff09;&#x…

Java 领域 offer 收割:程序员黄金 5 年进阶心得!

怎样才能拿到大厂的offer&#xff1f;没有掌握绝对的技术&#xff0c;那么就要不断的学习。如何拿下阿里等大厂的offer的呢&#xff0c;今天分享一个秘密武器&#xff0c;资深架构师整理的Java核心知识点&#xff0c;面试时面试官必问的知识点&#xff0c;篇章包括了很多知识点…

TCP连接的状态转换图深度剖析

在TCP/IP协议中&#xff0c;TCP协议提供可靠的连接服务&#xff0c;采用三次握手建立一个连接&#xff0c;如图1所示。&#xff08;1&#xff09;第一次握手&#xff1a;建立连接时&#xff0c;客户端A发送SYN包&#xff08;SYNj&#xff09;到服务器B&#xff0c;并进入SYN_SE…

ASP.Net中的TreeView控件中对节点的上移和下移操作

Web中的TreeView中的没有PreNode和NextNode属性。 但它的集合属性中有一个IndexOf属性&#xff0c;从而能够找到它的前一个节点知后一个节点。 TreeView中要么只有一个根节点&#xff1b;要么没有根节点&#xff0c;都是并列排的&#xff0c;这个要判断。 这里主要是用了递归&a…

大数据流通存隐忧 产业信任体系亟待建立

就在今年10月&#xff0c;始于美国东部的“DDoS攻击”席卷了整个美国&#xff0c;引起了人们对数据安全的恐慌&#xff0c;大数据安全问题逐渐暴露。在第三届世界互联网大会的大数据分论坛上&#xff0c;中国科学院秘书长邓麦村在致辞中指出&#xff0c;如何突破大数据关键技术…

ImageNet十年,AI数据标注如何蓬勃发展?

2016 年&#xff0c;AlphaGo 战胜李世石&#xff0c;成为新一代 AI 浪潮的重要里程碑事件。 经此一役&#xff0c;很多人都认识到了算法和算力对 AI 发展的重要性&#xff0c;确忽略了另一个重要因素&#xff1a;数据。 2009 年&#xff0c;时任斯坦福大学任助理教授的李飞飞…

关于webservice的异步调用简单实例

于webservice的异步调用简单实例无论在任何情况下&#xff0c;被调用方的代码无论是被异步调用还是同步调用的情况下&#xff0c;被调用方的代码都是一样的&#xff0c; 下面&#xff0c;我们就以异步调用一个webservice 为例作说明。这是一个webservice <WebMethod(Descrip…

理解NSAttributedString

An NSAttributedString object manages character strings and associated sets of attributes (for example, font and kerning) that apply to individual characters or ranges of characters in the string. 这句话就是对这个类的一个最简明扼要的概括。NSAttributedString…

Redis集群两种配置方式

2019独角兽企业重金招聘Python工程师标准>>> 第一种使用&#xff1a;JedisCluster <bean id"jedisPoolConfig" class"redis.clients.jedis.JedisPoolConfig"><property name"maxTotal" value"30" /><proper…

调用API弹出打印机属性对话框

调用api弹出打印机属性对话框 Author:vitoriatangFrom:Internet.NET Framework封装了很多关于打印的对话框&#xff0c;比如说PrintDialog, PageSetupDialog. 但是有的时候我们还需要关心打印机属性对话框&#xff0c;那么就可以调用API来解决这个问题。有几个API函数与之相关P…

Oracle DBA学习互联网化的内容

搞了多年的Oracle数据库维护&#xff0c;近几年来&#xff0c;个人感觉基本都在舒适区&#xff0c;技术上没啥进步。而且由于个人资料或者学习方法的限制&#xff0c;Oracle数据库技术上再想精进感觉事倍功半。2013年开始&#xff0c;去IOE的声势搞得轰轰烈烈&#xff0c;mysql…

离不开深度学习的自动驾驶

作者 | 小白来源 | 小白学视觉头图 | 下载于视觉中国深度学习在整个自动驾驶技术的各个部分中进行了应用&#xff0c;例如在感知&#xff0c;预测和计划中都有应用。同时&#xff0c;深度学习也可以用于制图&#xff0c;这是高级自动驾驶的关键组成部分。拥有准确的地图对于自动…

IOS -- base64编码

在iOS7以后可以用NSData自带的base64EncodedStringWithOptions进行编解码&#xff1a; 方法如下&#xff1a; - (NSString *)encodeToBase64String:(UIImage *)image {return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64Charact…

OpenCV持久化(二)

如何利用OpenCV持久化自己的数据结构&#xff1f;我们来看看OpenCV中的一个例子。 MyData.hpp定义自己的数据结构MyData如下: #ifndef MYDATA_HPP #define MYDATA_HPP#include <opencv2/core/core.hpp> #include <iostream> #include <string>using namespac…

Excel、Exchange和C#

摘要&#xff1a;Eric Gunnerson 将向您介绍如何使用 Outlook、Excel 和 C# 创建自定义的日历&#xff0c;该日历可以提供适用于短期项目和长期项目的清晰明了的版式。 下载 csharp05152003_sample.exe 示例文件&#xff08;英文&#xff09;。 虽然一月份已经过去了&#x…

这个宝藏工具,给你一种黑客般的感觉

明天要交作业了&#xff0c;吴检正在宿舍熬夜爆肝拼命敲代码&#xff0c;劈里啪啦的键盘声和咔咔的鼠标声格外嘈杂&#xff0c;室友陈琛瞥了一眼&#xff0c;背过身&#xff0c;沉沉睡去&#xff0c;留下他一人在深夜无尽的黑暗中&#xff0c;断断续续却又没有尽头的咔咔声中凌…

LSTM神经网络

LSTM是什么 LSTM即Long Short Memory Network&#xff0c;长短时记忆网络。它其实是属于RNN的一种变种&#xff0c;可以说它是为了克服RNN无法很好处理远距离依赖而提出的。 我们说RNN不能处理距离较远的序列是因为训练时很有可能会出现梯度消失&#xff0c;即通过下面的公式训…

用C#实现在PowerPoint文档中搜索文本

用编程的方式根据对象模型很容易实现在Word、Excel文档中搜索文本&#xff0c;在PowerPoint里面也同样如此&#xff0c;使用对象模型有助于我们了解office的文档结构。 搜索的思路和方法基本是一样的&#xff0c;用PowerPoint应用程序对象打开指定的文档&#xff0c;用文档对象…

雷军的最后一次 重 大 创 业

这是我人生最后一次重大创业项目。我愿意押上人生全部的声誉&#xff0c;亲自带队&#xff0c;为小米汽车而战&#xff01;——雷军作者 | Carol头图 | 下载于视觉中国出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;3月29日19:30&#xff0c;小米春季新品发布会拉…

shell之冒号的作用

冒号&#xff1a; &#xff1a;在shell中是一种命令&#xff0c;意思是总是为真&#xff0c;但是却不做任何操作&#xff0c;即总是为真的空命令eg:[rootlocalhost ~]# ${abc:t1}-bash: t1: command not found[rootlocalhost ~]# : ${abc:t1}[rootlocalhost ~]# echo $abct1[ro…

关于epel源的配置

EPEL&#xff0c;即Extra Packages for Enterprise Linux&#xff0c;这个软件仓库里有很多非常常用的软件,而且是专门针对RHEL设计的&#xff0c;对RHEL标准yum源是一个很好的补充&#xff0c;完全免费使用&#xff0c;由Fedora项目维护&#xff0c;所以如果你使用的是RHEL&am…

C#如何在Form中嵌入并且操作Excel表格

网上比较多讲述如何操作excel表的文章&#xff0c;但都是启动excel的窗口来打开excel数据文件。有时候需要把excel表嵌入到自己程序的form中&#xff0c;给客户一个不用切换窗口的操作界面&#xff0c;似乎更好。这在vc中用ole技术很容易实现&#xff0c;但是在c#中方法就不一样…

自研芯片架构 ,这家中国公司发布DPU芯片计划

近日,专注于智能计算领域的DPU芯片和解决方案公司中科驭数发布了其下一代DPU芯片计划&#xff0c;将基于自研的KPU&#xff08;Kernel Processing Unit&#xff09;芯片架构&#xff0c;围绕网络协议处理、数据库和大数据处理加速、存储运算、安全加密运算等核心功能&#xff0…

QQ超时不能刷新好友接收发送信息

如果您在其它电脑登录时正常&#xff0c;只在本地出现此种情况&#xff0c;可能与您本机的设置及网络限制有关&#xff0c;建议您先确保安装的是我司的官方版本&#xff0c;然后再搜索并删除您的QQ号码文件夹&#xff08;会丢失聊天记录&#xff0c;请注意备份&#xff09;&…

JavaStuNote 4

装箱(inbox)和拆箱(outbox) 代表了类类型和基本类型之间的转换行为。 手动版本号&#xff1a; Integer b new Integer(10); Int a b.intValue; 自己主动版本号&#xff1a; Integer b30; Integer bnew Integer(30); Int ab; int a b.intValue(); 由于基本类型…

把Doc文档转换成HTML等其它格式

利用microsoft Word 9.0 Object Library可以在页面中对Doc文档进行格式转换。有关Word对象的一些方法可以参考Open和Save。下面是进行转换的代码[C#]&#xff1a; /// <summary>/// WordToHtml 的摘要说明。/// 首先要添加引用&#xff1a;Microsoft Word 9.0 Object Li…

如何学好Python?相信很多人都做错了!

Python入门从哪开始&#xff0c;以我的过往经验&#xff0c;发现很多的教程都是这样讲的&#xff1a;先介绍 Python 的基本语法规则、list、dict、tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0c;介绍文件等IO操作.... 就这样一点一点往下说。然而这…

艾麦捷科技-铂金小猪新年致辞

2019独角兽企业重金招聘Python工程师标准>>> 光阴似箭&#xff0c;2013年是匆忙的一年&#xff0c;艾麦捷科技从最初的“笑谈”到现在上线&#xff0c;招财猪进销存管理软件从无到有&#xff0c;到现在多次更新&#xff0c;无一不是在匆忙中完成的&#xff0c;尽管很…