需求是要比较最近两个月的值,进行数据检验!所以我用自关联,来将两个月的数据放到一行上,然后进行比较!
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 了。