比較ニ種写法的SQL語句的効率 我觉得如果(select s.cs_code, s.apply_telno from srv_mst s where s.apply_telno like '06%')的结果集比srv_mst有明显减少的话,2比1效率要高,因为这样表间关联的次数会少很多。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用explain plan比较一下看看? 有关文档说是like的效率最低,你这样写的话,可能第二种更慢,出现了子查询,而子查询中还是有like! 謝謝諸位!我覚得与「Like」或「索引」没有太大関係吧?因為若建了索引、両種写法都能利用索引或不用索引、表的前提条件是相同的。関鍵是:両種SQL語句的不同写法、那個効率高呀? 第一种情况下,对cs_mst、srv_mst 的 cs_code 字段建立索引,并对srv_mst的apply_telno 字段建立索引,查询效率会高于后者。通常情况下,应尽可能用连接的方式来替换子查询方式的SQL语句。 在同种情况下,2相对要比1要快些:随便举个例子A表:1000条,B表2000,B表like可以得到101:(1000*20000)*2(like需要全集合扫描) = 20000000次2: 1000 * 10 +20000(like的扫描次数) = 21010次 你先确定你是使用rbo还是cbo呀!比较的大前提都没有确定,就来谈那个更好,有点早吧! 圣凤凰,explain plan看不出来的,有可能是完全一样的。如何建立索引,LIKE后记录集缩小多少百分点,这些都要具体情况具体分析吧。而且执行第二次是两者效率的相差有可能就很微小很微小了。 如果apply_telno是索引的话,两个SQL没有区别. 首先,评价SQL最好就是看执行计划,看逻辑读,他们不会骗你,如果两条SQL的执行计划和逻辑读完全相同,那你基本可以认定两条SQL对于ORACLE没有任何区别。其次,你的这两个SQL在同一环境下执行,效率是没有区别的。最后,纠正一些朋友的误区,形如第一条SQL的句子,ORACLE是会尽量先过滤两个数据集数据然后在JOIN的(并不是先做两个表的join在过滤数据的)。 要具体情况具体分析,SQL的效率跟表、索引结构,数据量等因素都有关系。 「执行计划」来了! 两種方法写的SQL語句的「执行计划」完全相同↓Plan Table--------------------------------------------------------------------------------| Operation | Name | Rows | Bytes| Cost | Pstart| Pstop |--------------------------------------------------------------------------------| SELECT STATEMENT | | 16 | 1K| 4 | | || HASH JOIN | | 16 | 1K| 4 | | || TABLE ACCESS BY INDEX RO|SRV_MST | 16 | 400 | 2 | | || INDEX RANGE SCAN |PK_SRVMST | 16 | | 1 | | || TABLE ACCESS FULL |CS_MST | 22 | 1K| 1 | | |-------------------------------------------------------------------------------- 上面的格式太乱、再貼! 两種方法写的SQL語句的「执行计划」完全相同↓Plan Table-------------------------------------------------------------------|Operation | Name |Rows|Bytes|Cost|Pstart|Pstop|-------------------------------------------------------------------|SELECT STATEMENT | | 16 | 1K| 4 | | || HASH JOIN | | 16 | 1K| 4 | | || TABLE ACCESS BY INDEX RO|SRV_MST | 16 | 400 | 2 | | || INDEX RANGE SCAN |PK_SRVMST| 16 | | 1 | | || TABLE ACCESS FULL |CS_MST | 22 | 1K| 1 | | |------------------------------------------------------------------- 呵呵,说通俗点,执行计划就是ORACLE眼中的最终执行的SQL不论你眼中上面两个SQL有什么区别,但最终执行计划是一样的,也就是说对于你现在这个环境下的ORACLE来说他们是一样的。影响执行计划的条件很多,我们可以改变它。但你现在这两条简单的SQL,在你这个默认环境下是相同的。 影响执行计划的条件很多,我们可以改变它。但你现在这两条简单的SQL,在你这个默认环境下是相同的。是啊。我觉得这位大哥说的有道理。只要要求不是很高只要能实现功能就可以了。不过本人觉得第一种写法效率比较高。 还有我觉得这两种写法。在具体ORACLE执行的时候算法肯定是不一样的。所以肯定有效率的区别了/ ora-12560问题。急急急 哪位帮忙把下面的mysql建表语句转成oracle的? Oracle如何导出大文本到sql pl sql developer 打点不出? 为什么直接查询视图同将视图中SQL语句拿出来查询得到的结果不一样? 数据库锁的问题 insert into 问题? 简单.. 一个有点复杂的SQL文(INSERT) 调用存储过程权限不足(存储过程中使用了dbms_sql),迷惑很久的问题 请求帮助 为何我把 Grant dba to newuser,可 用newuser 以sysdba 登录时,还是提示权限不足。 也来散分咯!!!
因為若建了索引、両種写法都能利用索引或不用索引、表的前提条件是相同的。関鍵是:両種SQL語句的不同写法、那個効率高呀?
A表:1000条,B表2000,B表like可以得到10
1:(1000*20000)*2(like需要全集合扫描) = 20000000次
2: 1000 * 10 +20000(like的扫描次数) = 21010次
比较的大前提都没有确定,就来谈那个更好,有点早吧!
两个SQL没有区别.
--------------------------------------------------------------------------------
| Operation | Name | Rows | Bytes| Cost | Pstart| Pstop |
--------------------------------------------------------------------------------
| SELECT STATEMENT | | 16 | 1K| 4 | | |
| HASH JOIN | | 16 | 1K| 4 | | |
| TABLE ACCESS BY INDEX RO|SRV_MST | 16 | 400 | 2 | | |
| INDEX RANGE SCAN |PK_SRVMST | 16 | | 1 | | |
| TABLE ACCESS FULL |CS_MST | 22 | 1K| 1 | | |
--------------------------------------------------------------------------------
-------------------------------------------------------------------
|Operation | Name |Rows|Bytes|Cost|Pstart|Pstop|
-------------------------------------------------------------------
|SELECT STATEMENT | | 16 | 1K| 4 | | |
| HASH JOIN | | 16 | 1K| 4 | | |
| TABLE ACCESS BY INDEX RO|SRV_MST | 16 | 400 | 2 | | |
| INDEX RANGE SCAN |PK_SRVMST| 16 | | 1 | | |
| TABLE ACCESS FULL |CS_MST | 22 | 1K| 1 | | |
-------------------------------------------------------------------
不论你眼中上面两个SQL有什么区别,但最终执行计划是一样的,也就是说对于你现在这个环境下的ORACLE来说他们是一样的。影响执行计划的条件很多,我们可以改变它。
但你现在这两条简单的SQL,在你这个默认环境下是相同的。
但你现在这两条简单的SQL,在你这个默认环境下是相同的。
是啊。我觉得这位大哥说的有道理。
只要要求不是很高只要能实现功能就可以了。
不过本人觉得第一种写法效率比较高。
算法肯定是不一样的。所以肯定有效率的区别了/