忽略SQL改造等价性(看似等价其实不等)

请看SQL写法不等价的相关例子

in与范围写法

drop table t purge;
create table t as select * from dba_objects;
create index idx_object_id on t(object_id,object_type);
UPDATE t SET OBJECT_ID=20 WHERE ROWNUM<=26000;
UPDATE t SET OBJECT_ID=21 WHERE OBJECT_ID<>20;
COMMIT;
set linesize 266
set pagesize 1
alter session set statistics_level=all ;select  /*+index(t,idx_object_id)*/ * from t  where object_TYPE='TABLE'  AND OBJECT_ID >= 20 AND OBJECT_ID<= 21;
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
-------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |      1 |        |   2925 |00:00:00.03 |    1103 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T             |      1 |   2126 |   2925 |00:00:00.03 |    1103 |
|*  2 |   INDEX RANGE SCAN          | IDX_OBJECT_ID |      1 |    320 |   2925 |00:00:00.02 |     730 |
-------------------------------------------------------------------------------------------------------select  /*+index(t,idx_object_id)*/ * from t t where object_TYPE='TABLE'  AND  OBJECT_ID IN (20,21);
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
---------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------------------
|   1 |  INLIST ITERATOR             |                |      1 |        |   2920 |00:00:00.01 |     563 |
|   2 |   TABLE ACCESS BY INDEX ROWID| t              |      2 |   2592 |   2920 |00:00:00.01 |     563 |
|*  3 |    INDEX RANGE SCAN          | IDX1_OBJECT_ID |      2 |      1 |   2920 |00:00:00.01 |     214 |
--------------------------------------------------------------------------------------------------------

你眼中只有快吗

---看官们,续集来这瞧瞧如下试验drop table t purge;
create table t as select * from dba_objects;
update t set object_id =null where rownum<=2;
set autotrace off
select count(*) from t;
select count(object_id) from t;--哎呀我的天,两个语句不等价,又如何谈性能呢,所以我们不能说必须要用COUNT(列)代替COUNT(*),因为两者并不等价。
--记住,调优改写,要是等价改写!

看似不等,其实相等

begin
select count(*) into v_cnt from t1 ;
if v_cnt>0
then  …A逻辑….
else
then  …B逻辑…..
End;我来翻译一下这段需求:获取t1 表的记录数,判断是否大于0,如果大于0走A逻辑,否则就走B逻辑。因此代码就如上所示来实现了。真正的需求是这样吗?其实应该是这样的:只要T1表有记录就走A逻辑,否则走B逻辑。
两者有区别吗?其实区别还是很大的,前者可是强调获取记录数,我们是不是一定要遍历整个表得出一个记录数才知道是否大于0?真正需求的理解可以让我们这样实现,只要从T1表中成功获取到第一条记录,就可以停止检索了,表示该表有记录了,难道事实不是这样?因此原先的SQL1 从Select count(*) from t1; 被改造为:
Select count(*) from t1 where rownum=1; begin
select count(*) into v_cnt from t1 where rownum=1;
if v_cnt=1
then  …A逻辑….
else
then  …B逻辑…..
End;

看似不等价其实等价的例子

忽略SQL改造等价性相关推荐

  1. 等价关系和等价类_确定Java等价性的新时代?

    等价关系和等价类 几个月前,我读了一篇题为"确定Java等价性的新时代?"的博客文章. 这在某种程度上与我当时在我那令人沮丧的副项目Java :: Geci中开发的内容非常吻合 . ...

  2. 确定Java等价性的新时代?

    几个月前,我读了一篇题为"确定Java等价性的新时代?"的博客文章. 这在某种程度上与我当时在我那令人脚的副项目Java :: Geci中开发的内容非常吻合 . 我建议您暂停阅读, ...

  3. java 实现nfa的化简_DFA与NFA的等价性,DFA化简

    等价性 对于每个NFA M存在一个DFA M',使得L(M)=L(M')--------等价性证明,NFA的确定化 假定NFA M=,我们对M的状态转换图进行以下改造: 解决初始状态唯一性:引进新的初 ...

  4. sql 拆分_技术分享 | 基于分布式中间件的SQL改造指南

    原创作者: 孙正方 4月12日,GOPS全球运维大会在深圳隆重召开,全球运维大会是国内第一个运维行业大会,爱可开源社区在基础架构及DevOps解决方案专场分享了<基于分布式中间件的SQL改造指南 ...

  5. 最优化——分析线性规划的对偶问题的等价性

    文章目录 最优化-对偶原理与对偶单纯形法 线性规划的对偶原理 原问题为何与对偶问题等价 前提1 前提2 证明等价性 最优化-对偶原理与对偶单纯形法 线性规划的对偶原理 对于标准线性规划问题: max⁡ ...

  6. 函数的凹凸性证明_理解图灵机和递归函数的等价性证明

    背景 之前读了 Martin Davis 的<Computability and Unsolvability>,决定对其中的图灵机和递归函数等价性证明做一个(不严谨的)整理,证明方法比较有 ...

  7. Java中的equals和==的差别 以及Java中等价性和同一性的讨论

    ==对基本数据类型比较的是值,对引用类型比较的是地址 equals()比较的是对象的数据的引用 等价性原理: 自反性    x.equals(x)为true 对称性    x.equals(y) 为t ...

  8. 资源放送丨《SQL条件等价改写秘笈》PPT视频

    点击上方"蓝字" 关注我们,享更多干货! 前段时间,墨天轮邀请数据库资深专家 怀晓明 老师分享了<SQL条件等价改写秘笈>,在这里我们将课件PPT和实况录像分享出来,供 ...

  9. 15日直播预告丨SQL条件等价改写秘笈(主讲人:怀晓明)

    经典知识库:SQL条件等价改写秘笈 -7月15日20:00 如果你有一定SQL编写及优化经验,那么SQL等价改写很可能会是你了解的一个技能领域.根据实际从业情况,你或多或少,都会知道一些SQL等价改写 ...

最新文章

  1. .NET中的加密算法总结(自定义加密Helper类续)
  2. oracle RAC信息,Oracle 查看 RAC GI 版本信息
  3. linux命令:vmstat
  4. Google解密携手宏达电:确保Android一炮打响
  5. 中国农业主导市场趋势报告、技术动态创新及市场预测
  6. 用Navicat for MySQL往数据表中添加数据时汉字出现乱码
  7. SSL加速卡调研的原因及背景
  8. 【软考高级:信息系统项目管理师】【信息项目十大管理】第二天:项目立项管理
  9. uCharts 图表
  10. Ipad mini2、苹果5s降级10.3.3教程
  11. 如何将数据转换为时间序列数据
  12. 计算机键盘上范的怎么点击,微信怎么用键盘最小化 电脑最小化键盘怎么按
  13. [NPUCTF2020]ReadlezPHP(反序列化)
  14. 2023北京电子科技大学计算机考研信息汇总
  15. Unity中OnRenderImage屏幕后处理做Graphics.blit时遇到的一个问题
  16. 超简单教你在树莓派上安装opencv(二)
  17. 中国科学院大学-计算机体系结构-胡伟武老师 复习、往年真题整理(含解答)
  18. Android手机同时使用Wi-Fi和数据流量
  19. Java 基础篇(一)基本概念
  20. 批量保存PC端抖音多个视频方法步骤

热门文章

  1. 深入理解Struts2
  2. 一起认识FileShare
  3. 【Redis学习】Redis开启多个端口
  4. 2018-05-17 第十一天
  5. Hangfire 任务调度
  6. HMAILSERVER集成WEB邮件系统(ROUNDCUBE WEBMAIL)
  7. 实战:Windows Server 2008 使用WSUS实现内网计算机系统更新
  8. 系出名门Android(2) - 布局(Layout)和菜单(Menu)
  9. ios消息推送机制原理与实现(转)
  10. 性能测试, 压力测试 , 负载测试和 容量测试 的区别与联系