oracle 两表关联时,年月条件的写法引起的巨大性能的差异

需求是要比较最近两个月的值,进行数据检验!所以我用自关联,来将两个月的数据放到一行上,然后进行比较!

sql语句类似于:

select b.ny,b.dwdm,。。。。,
     a.js  as sy_js , b.js,    --取出上下两个月的同一列的指标。
     。。。。。。。
 from tjxx_10 a,tjxx_10 b where    a.dwdm=b.dwdm and a.shbz=b.shbz and a.csxm=b.csxm
  and b.ny=‘201508‘ and a.ny=b.ny-1

这个语句就是把tjxx_10自关联一下,然后让a行指标201507,b行指标201508.

由于该表已经比较大了有几十万行吧!结果上面执行查询,就要4秒左右。

第一次修改:

 and b.ny=‘201508‘ and a.ny=201507

这么关联,还是4秒。

第二次修改

and b.ny=‘201508‘ and a.ny=‘201507‘

结果竟然是 0.02秒。

结论:一直以来,我认为在sql中,ny列是varchar2(6)

a.ny=b.ny-1 或者a.ny=201507这种写法都是对的。因为都能正确执行。我认为oracle会自动把数字转为字符串!

但今天遇到这个超大表时,展示出的性能差异说明oracle对上面两种情况都不能利用索引,

因为右侧相当于一个函数,可能要遍历每一行记录,

切记:ny=‘201507‘  不要再写做  ny=201507    了。

时间: 2024-10-03 19:47:33

oracle 两表关联时,年月条件的写法引起的巨大性能的差异的相关文章

Oracle两表关联(join)更新字段值一张表到另一张表

[采用视图更新的方式] 有需求A表,B表,需要将B表中的name字段更新到A表中的name,两表有id关联,代码如下: update  (select a.name aname, b.name bname from A a, B b where a.id = b.id) set aname = bname; --注:两表关联属性id必须为unique index或primary key

Oracle创建两表关联查询的视图

在项目开发中,有时候会用到多表查询,有很多种方法,比如关联,比如视图,但对于查询来说,视图查询是最快的,如果你的数据库的字段信息很多,那查询就得整表查,比如两表查询,我们就可以把要的字段抽取出来,放在视图中,这样查询时就只要查询视图中所要的字段,其他的就可以无视.下面我记录一下Oracle创建视图 大多人操作数据库是用Scott权限进行操作数据库,但Scott是没有创建视图的权限的,所以我们要进入管理员System账号,进去给Scott授权一个创建视图权限.进入System后,我们打入以下语句

Oracle中如何实现Mysql的两表关联update操作

在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.price WHERE items.id=month.id; 在MySQL中构造表验证了一下 mysql> select * from test; +------+--------+ | id | salary | +------+--------+ | 1 | 100 | | 2 | 200 | | 3

oracle MERGE INTO...USING两表关联操作(效率高)

数据量小的时候可以使用子查询做两表关联操作:但数据量大的时候子查询效率太低(因为是单条比对) 比如: update person1 p1 set p1.p_name=(select p_name from person2 where p1.p_id=p2.p_id) where p1.add_date>to_date('2014-09-01','yyyy-mm-dd') 而使用MERGE INTO...USING 作两表关联操作(增.删.改)就效率非常高 MERGE INTO person1 p

oracle多表关联更新

oracle的更新语句不通MSSQL那么简单易写,就算写出来了,但执行时可能会报 这是由于set哪里的子查询查出了多行数据值,oracle规定一对一更新数据,所以提示出错.要解决这样必须保证查出来的值一一对应. 原理 Update语句的原理是先根据where条件查到数据后,如果set中有子查询,则执行子查询把值查出来赋给更新的字段,执行更新. update dept a    set a.loc = (select b.loc from test_dept b where a.deptno =

[转载] ORACLE 多表关联 UPDATE 语句

为了方便起见,建立了以下简单模型,和构造了部分测试数据:在某个业务受理子系统BSS中, SQL 代码 1 --客户资料表 2 create table customers 3 ( 4 customer_id number(8) not null, -- 客户标示 5 city_name varchar2(10) not null, -- 所在城市 6 customer_type char(2) not null, -- 客户类型 7 ... 8 ) 9 create unique index P

SQL两表关联查询&批量修改字段值

SQL关联查询&修改字段,正确范例如下: --批量修改报告单位名称&更新时间 --tt和tp两表关联查询,将符合条件的tt表中的principal字段更新到tp表的ruperson字段 merge into nhis34.t_publicplaces tp using standard.t_organization tt on (tt.orgcode = tp.r_orgcode and tp.create_time > '2015-05-07 00:00:00') when mat

多表关联时视图查出重复数据问题

多表关联时本身有一条数据,但是视图查出重复数据用distinct可以解决. 如: 视图如下 SELECT DISTINCT t1.station_id as station_id, t1.tick_sn as tick_sn, t1.order_id as order_id, t2.station_name as station_name, t3.game_id as game_id, FROM electric_lottery_report_info t1LEFT JOIN electric_

MySQL 中两表关联更新数据

通过用户手机号,更新他的添加时间和过期时间,两表关联更改副表内容 UPDATE expand_money e INNER JOIN members m ON e.uid = m.id SET e.add_time=unix_timestamp(),e.expired_time=unix_timestamp()+60*60*24*7 WHERE m.user_phone = '139139139139'