等号两边函数对性能的影响。

[复制链接]
查看11 | 回复8 | 2010-3-1 11:04:59 | 显示全部楼层 |阅读模式
在前一段时间提问的一个帖子中, 〇〇和newkid提到:“最好别=左右都是函数”, “主要是左边(在列上执行函数)”。 当时, 没有搞懂为什么。 最近在网上找了很久, 也没有找到答案, 那位能解释一下, 为什么"=左右都是函数 or 主要是左边(在列上执行函数)"会对性能有影响。
原始的帖子: http://www.itpub.net/thread-1943397-1-1.html

回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
左右都是函数,就用不上索引了,除非专门建立函数索引
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
〇〇 发表于 2016-5-11 10:46
左右都是函数,就用不上索引了,除非专门建立函数索引

除去索引这个问题不说,也不建议两边都用函数,特别是左边,实际操作中全表扫描如果左边有函数效率明显降低。
我的理解是,左边的函数每行都要解析计算,而右边的函数计算一次所有行都会使用。
不知道我理解的对不对呢 ?
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
liuzhe_521 发表于 2016-5-11 12:30
除去索引这个问题不说,也不建议两边都用函数,特别是左边,实际操作中全表扫描如果左边有函数效率明显降 ...

where a=abs(b) 和 where abs(b)=a没有区别
SQL> with t as (select level a, level b from dual connect by level SQL> 2
A
B
---------- ----------
1
1
2
2
3
3
已用时间:00: 00: 00.00
执行计划
----------------------------------------------------------
Plan hash value: 2403765415
--------------------------------------------------------------------------------------
| Id| Operation
| Name | Rows| Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|| 1 |26 | 2 (0)| 00:00:01 |
|*1 |VIEW
|| 1 |26 | 2 (0)| 00:00:01 |
|*2 | CONNECT BY WITHOUT FILTERING|| | |
|
|
| 3 |FAST DUAL
|| 1 | | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("A"=ABS("B"))
2 - filter(LEVEL with t as (select level a, level b from dual conn ...
是的,这种情况是一样的。
我意思是类似这样:
假如where col_a=func(var)(col_a是字段,var是常量)和
where fun(col_a)=var是等价的,那第一个效率也会高点,

我的理解是,左边的函数每行都要解析计算,而右边的函数计算一次所有行都会使用。
不知道我理解的对不对呢 ?

这样理解是否正确呢?
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
liuzhe_521 发表于 2016-5-11 13:13
是的,这种情况是一样的。
我意思是类似这样:
假如where col_a=func(var)(col_a是字段,var是常量) ...

问题不在于左右,而在于函数参数是字段还是常量
如果是系统自带确定性函数,常量参数,值就固定了
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
〇〇 发表于 2016-5-11 13:18
问题不在于左右,而在于函数参数是字段还是常量
如果是系统自带确定性函数,常量参数,值就固定了

是的 ,我是这个意思但没说明白。
where col_a=func(var)(col_a是字段,var是常量)和
where fun(col_a)=var是等价的,这个效率分析我上面的理解对吗?或者请帮忙解释下。
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
liuzhe_521 发表于 2016-5-11 13:38
是的 ,我是这个意思但没说明白。
where col_a=func(var)(col_a是字段,var是常量)和
where fun(co ...

自己做测试就知道了
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
liuzhe_521 发表于 2016-5-11 13:38
是的 ,我是这个意思但没说明白。
where col_a=func(var)(col_a是字段,var是常量)和
where fun(co ...

OO已经在6楼回答了啊
回复

使用道具 举报

千问 | 2010-3-1 11:04:59 | 显示全部楼层
jxc_hn 发表于 2016-5-11 14:37
OO已经在6楼回答了啊

我问的是效率分析问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行